AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EDivByZero ohne Sysutils fangen

Ein Thema von Win32.API · begonnen am 4. Aug 2011 · letzter Beitrag vom 4. Aug 2011
Antwort Antwort
Seite 2 von 2     12   
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#11

AW: EDivByZero ohne Sysutils fangen

  Alt 4. Aug 2011, 16:03
Mit {$O-} Die Frage ist wieso verweigert der Exception-Handler den Dienst, wenn ich die Sysutils nicht einbinde.
Macht er doch gar nicht, er schreibt doch
Zitat:
Runtime error 200 at 00402482
Es ist halt nicht der aus Sysutils, sondern der, der default da ist (wenn Du VCL benutzt hast Du immer Sysutils).
Der Delphi interne Exception-Handler verschluckt die Exception und reicht sie nicht wie erwartet an meinen lokalen Handler weiter. Was ich sehr merkwürdig finde.

Delphi-Quellcode:
procedure RunErrorAt(ErrCode: Integer; ErrorAtAddr: Pointer);
begin
  ErrorAddr := ErrorAtAddr;
  _Halt(ErrCode);
end;
Ohne SysUtils ladet man dort und mit SysUtils wird stattdessen für bekannte Fehler die entsprechende Exception ausgelöst.
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: EDivByZero ohne Sysutils fangen

  Alt 4. Aug 2011, 16:16
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?
Hast du der FPU/CPU auch gesagt das für dich DivByZero eine Exception ist?
Stichwort wäre hier: SetExceptionMask
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#13

AW: EDivByZero ohne Sysutils fangen

  Alt 4. Aug 2011, 16:34
IMHO initialisiert Delphi die FPU mit Exceptions. SetExceptionMask liegt leider in der Math.pas die Sysutils.pas importiert. Ein direktes Aufrufen von Set8087CW($1372) bringt aber leider auch keine Besserung.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#14

AW: EDivByZero ohne Sysutils fangen

  Alt 4. Aug 2011, 16:35
Im Klartext heißt das, dass ich keine Chance habe über einen lokalen Delphi-Exception-Handler diese Exception zu fangen?
Tip mal ExceptProc und drück F1, falls Du kein Delphi mit Onlinehilfe mehr hast, hier die Ausgabe von D6:

Zitat von Delphi Hilfe:

Points to the lowest-level RTL exception handler.

Unit System

Category exception handling routines

var ExceptProc: Pointer;

Description

ExceptProc handles unhandled exceptions (exceptions that have not been caught in the except portion of a try..except statement.) If your application has a TApplication object, it automatically catches exceptions and generates an OnException event (to which you can respond using either the application’s or a TApplicationEvents object’s OnException event handler). Thus, because the TApplication object catches the exceptions, they never reach the ExceptProc handler. However, even if you have a TApplication object, it does not catch exceptions generated during initialization and finalization. These are handled by ExceptProc.

You can hook into ExceptProc to change how unhandled exceptions are reported. To do so, save the contexts of ExceptProc before changing it to the address of your own exception handler. The first statement of your new exception handler must then reinstall the saved value of ExceptProc. In this way, the ExceptProc procedure becomes part of a chain of exception procedures, each of which is executed in reverse order of installation.

The procedure assigned to ExceptProc must have a signature such as the following:

procedure ExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer);
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#15

AW: EDivByZero ohne Sysutils fangen

  Alt 4. Aug 2011, 16:45
Dieser Handler bekommt von der Exception leider auch nichts mit, außerdem ist er global, was ich nach wie vor gerne vermeiden würde.
  Mit Zitat antworten Zitat
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
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz