![]() |
Delphi-Version: XE
EDivByZero ohne Sysutils fangen
Hallo Zusammen!
Ich stehe gerade etwas auf dem Schlauch. Wieso fängt Delphi diese Exception nicht:
Delphi-Quellcode:
Na gut, das es ohne die Sysutils keine EDivByZero Exception gibt ist irgendwie klar, aber ich hätte trotzdem erwartete, dass ich im Except-Zweig lande.
program Project1;
{$APPTYPE CONSOLE} {$O-} //uses SysUtils; //Ohne Kommentar funktioniert es wunderbar :O var d: Integer; begin try d := 0; d := d div d; except writeln('Wer haette es gedacht ...'); end; readln; end. Gibt es eine Möglichkeit, Delphi davon zu Überzeugen, die Exception auch ohne Sysutils im Except-Block zu fangen? SEH per Hand (fs[0] ...), SetUnhandledExceptionFilter oder AddVectoredExceptionHandler würde ich gerne vermeiden. Schönen Gruß, Win32.API |
AW: EDivByZero ohne Sysutils fangen
Bei dem Code wird die Division wegoptimiert.
|
AW: EDivByZero ohne Sysutils fangen
Im Release-Modus mit
Delphi-Quellcode:
schon, ich meine aber eigentlich den Debug-Modus mit
{$O+}
Delphi-Quellcode:
.
{$O-}
|
AW: EDivByZero ohne Sysutils fangen
Hast du mal Breakpoints gesetzt?
So kannst du ja ganz leicht feststellen ob und was da wegoptimiert wurde oder auch nicht. Mach halt im Zweifelsfall mal ein writeln(d); hinter die Division. |
AW: EDivByZero ohne Sysutils fangen
Du meinst writeln(d); ;)
|
AW: EDivByZero ohne Sysutils fangen
Öhm.. ja, richtig! :oops:
|
AW: EDivByZero ohne Sysutils fangen
Mit
Delphi-Quellcode:
wird nichts "wegoptimiert". Darum geht es hier aber auch nicht, es geht auch nicht darum, ob der Quelltext so Sinn macht oder nicht. Die Frage ist wieso verweigert der Exception-Handler den Dienst, wenn ich die Sysutils nicht einbinde.
{$O-}
Edit: Das Problem ist, dass die Exception geworfen wird, aber der Exception-Handler diese nicht fängt. Das Programm stürzt also ohne Sysutils ab (Projekt 1 funktioniert nicht mehr ...). |
AW: EDivByZero ohne Sysutils fangen
Vermutlich weil die SysUtils nicht nur die Exceptionklassen bereitstellt, sondern auch noch so Einiges für die Exception-Behandlung initialisieren/einbinden.
Ohne SysUtils wird bei dieser Exception ein Zitat:
Die Behandlung bricht also sofort ab und das war's dann, da die Exception unbehandelt bis in System durchgerauscht ist. |
AW: EDivByZero ohne Sysutils fangen
Zitat:
Zitat:
|
AW: EDivByZero ohne Sysutils fangen
Delphi-Quellcode:
Ohne SysUtils ladet man dort und mit SysUtils wird stattdessen für bekannte Fehler die entsprechende Exception ausgelöst.
procedure RunErrorAt(ErrCode: Integer; ErrorAtAddr: Pointer);
begin ErrorAddr := ErrorAtAddr; _Halt(ErrCode); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz