DivByZero ist doch schon eine Exception wieso wird diese nicht weitergereicht? Im Klartext heißt das, dass ich keine Chance habe über einen lokalen Delphi-
Exception-Handler diese
Exception zu fangen?
Eben nicht.
Es ist eine System-
Exception und keine Delphi-
Exception.
Ohne SysUtils keine Delphi-Exceptions und ohne Delphi-Exceptions (also die Objekte, welche ein Nachfahre von der Klasse
Exception sind), gibt es auch keine Try-Except/Finally-Behandlung.
Die System-
Exception für
div 0
hat den Fehlercode 200, welches nach TRuntimeError reDivByZero gemapt wird.
Mit eingebundener SysUtils wird dann reDivByZero abgefangen und stattdessen eine
Exception EDivByZero ausgelöst.
Delphi-Quellcode:
{ RTL error handler }
procedure ErrorHandler(ErrorCode: Byte; ErrorAddr: Pointer);
export;
var
E:
Exception;
begin
case ErrorCode
of
Ord(reOutOfMemory):
E := OutOfMemory;
Ord(reInvalidPtr):
E := InvalidPointer;
Ord(reDivByZero)..Ord(High(TRuntimeError)):
begin
with ExceptMap[ErrorCode]
do
E := ExceptTypes[EClass].Create(EIdent);
end;
else
E := CreateInOutError;
end;
raise E at ErrorAddr;
end;
const
ExceptTypes:
array[TExceptType]
of ExceptClass = (
EDivByZero,
ERangeError,
...);
ExceptMap:
array[Ord(reDivByZero)..Ord(High(TRuntimeError))]
of TExceptRec = (
(EClass: etDivByZero; EIdent: SDivByZero),
(EClass: etRangeError; EIdent: SRangeError),
...);