Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#16

AW: EDivByZero ohne Sysutils fangen

  Alt 4. Aug 2011, 16:56
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),
    ...);
$2B or not $2B

Geändert von himitsu ( 4. Aug 2011 um 16:58 Uhr)
  Mit Zitat antworten Zitat