AGB  ·  Datenschutz  ·  Impressum  







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

Exception-Behandlung weiterreichen

Ein Thema von himitsu · begonnen am 6. Sep 2009 · letzter Beitrag vom 6. Sep 2009
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 00:19
Also, da ich ja nun mein himXML nochmal in großen Teilen grundlegend überarbeite, bin ich nun auch an der Exception-Behandlung dran ...

Mein Problem ist nun das Abfangen externer Exceptions, welche mit meinen Programmteilen selber nix zu tun haben. Worauf ich auch absolut keinen Einfluß hab, welches aber dein eigenen Programmablauf eigenlich nicht stören soll.

Die eigenen Exceptions werden ja notfalls behandelt und meißtens mit Abruch meiner Rutienen nach außen weitergegeben.

Nun soll aber bei den erwähnten Exceptions nichts abbrechen, aber es soll dennoch der Mechianismuß ausgelößt werden, wie wenn eine Exception bis zur "Basis" durchwandert.

In den altuell gestellten Sourcens sieht es ja noch so aus:
Delphi-Quellcode:
Procedure TXMLFile.DoNodeChange(Node: TXMLNode; CType: TXMLNodeChangeType);
  Begin
    _Changed := True;
    If Assigned(_OnNodeChange) Then
      Try
        _OnNodeChange(Node, CType);
      Except
        ShowException(ExceptObject, ExceptAddr);
      End;
  End;
Da nun aber die Verwendung von ExceptObject und ExceptAddr, bei eventuell vorhandenen MultiThread-Anwendungen, im Grunde ganz böse sein seins sollen, hatte ich es kurzzeitig so.
Delphi-Quellcode:
Procedure TXMLFile.DoNodeChange(Node: TXMLNode; CType: TXMLNodeChangeType);
  Begin
    _Changed := True;
    If Assigned(_OnNodeChange) Then
      Try
        _OnNodeChange(Node, CType);
      Except
        On E: Exception do ShowException(E, nil);
      End;
  End;
Aber nun ist ShowMessage ja auch nicht das Wahre,
denn was ist, wenn jemand global die Exceptions nicht anzeigt, sondern z.B. mitloggt?

OK, nun ging der Weg also da hin:
Delphi-Quellcode:
Procedure TXMLFile.DoNodeChange(Node: TXMLNode; CType: TXMLNodeChangeType);
  Begin
    _Changed := True;
    If Assigned(_OnNodeChange) Then
      Try
        _OnNodeChange(Node, CType);
      Except
        If Assigned(ApplicationHandleException) Then
          {Classes.}ApplicationHandleException(E)
        Else If Assigned(ApplicationShowException) Then
          {Classes.}ApplicationShowException(E)
        Else
          {SysUtils.}ShowException(E, nil);
      End;
  End;
Dieses sieht ja nun erstmal garnicht soooo schlecht aus, aber nur wenn man nicht genauer hinguckt.

Also beim eintreten einer Exception wird z.B. ApplicationHandleException aufgerufen, dort meldet sich z.B. TApplication an und hat da {T}Application.HandleException angemeldet, welches wiederum {T}Application.OnHandleException aufruft, wo man ja wiederrum was Eigenes eintragen kann.

Aber beim genauen Hingucken, da mich dieses Sender etwas störte/irritierte,
Delphi-Quellcode:
var
  ApplicationHandleException: procedure (Sender: TObject) of object = nil;
stieß ich doch wieder auf dieses "böse" ExceptObject
Delphi-Quellcode:
procedure TApplication.HandleException(Sender: TObject);
var
  O: TObject;
begin
  if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
  O := ExceptObject;
Ja und nun meine Frage, wie wüdet ihr das machen?
  • _OnNodeChange ist sozusagen XML.OnChange und was darin passiert, soll keinen Einfluß auf den restlichen Programmablauf haben, aber dennoch soll diese Exception auch nicht still und heimlich verschwinden oder "nur" via ShowException rausgehn, welches ach nur die Exception anzeigt
  • Meine nachfollgende Behandlung soll nicht unterbrochen werden, also MUß ich ja die Exception abfangen.
  • aber dennoch soll in z.B. in Application.OnException etwas ankommen
    (direkt Application.OnException anzusprechen kommt nicht in Frage)
    • denn a) hab ich die Forms-Unit nicht bei mir integriert
    • und b) könnte ja eine andere Execeptio-Behandlung z.B. ala MadExcept installiert sein


PS: ShowMessage macht nix Anderes als dieses (funktionelle Kurzfassung von SysUtils.ShowException)
Delphi-Quellcode:
procedure ShowException(ExceptObject: TObject; ExceptAddr: Pointer);
begin
  if IsConsole then
    WriteLn(ExceptObject.Message)
  else
    ShowMessage(ExceptObject.Message);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 05:00
Führe doch einfach eine Property ein, ob die Exceptions angezeigt werden sollen und einen Handler OnError oder so.

Dann kannst du genau wie bei deinem Beispiel schauen, ob der Handler zugewiesen ist und den ggf. aufrufen und je nach Einstellung die Meldung anzeigen oder nicht. Wenn der Benutzer dann keine Meldung eingestellt hat und keinen Handler zugewiesen hat, bekommt er eben nix von der Exception mit.

Und bei vom Benutzer aufgerufenen Methoden könnte noch eine zusätzliche Property dazukommen, ob die Exceptions mit raise durchgeleitet oder abgefangen und nur ggf. an OnError oder so weitergeleitet werden sollen.

So könnte man das genau an die eigene Anwendung und deren Fehlerbehandlung anpassen, denn da unterscheiden sich die Konzepte ja relativ stark.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 10:37
Meine Überlegung war halt, die Exception an die eventuell bereits reistrierte Exception-Behandlung weiterzureichen, so daß eben nicht nocheine weiter Registrierungsstelle dazukommt.

Es geht hier ja nur um Exceptions in den anderen (aktuell noch) zwei StatusEvents, wo die dort eventuell auftetenden Exceptions ja den weiteren Programmablauf nicht verändern (gibt da ja keine Rückkopplung oder so).


Also würde ich dann sowas einbauen
Delphi-Quellcode:
type TXMLExceptionEvent = Procedure(E: Exception; Owner: TObject; Var ShowError: Boolean) of Object;

property OnException: TXMLExceptionEvent;
ShowError wäre per Standard False und wenn man es auf True setze, würde die Exception-Meldung von mir angezeigt.

Owner wäre dann das Objekt in dessen Ereignisprozedur es passiert ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 11:51
ExceptObject und ExceptAddr sind nicht böse. Sie sind Thread-lokal.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 11:56
Zitat von himitsu:
Owner wäre dann das Objekt in dessen Ereignisprozedur es passiert ist.
Ich würde es eher standardgemäß machen:type TXMLExceptionEvent = Procedure(Sender: TObject; E: Exception; Var ShowError: Boolean) of Object;
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 12:26
Zitat von Apollonius:
ExceptObject und ExceptAddr sind nicht böse. Sie sind Thread-lokal.
Ich finde grad den Thread nicht mehr, aber vor Ewigkeiten (ich glaub irgendwann letzes/vorletztes Jahr) hatte ich diese mal innerhalb von Try-Except verwendet und da hieß es man solle on E: Exception do verwenden, weil ExceptObject nicht sicher sei.


Zitat:
Sender: TObject;
OK, wird gemacht.

Dachte erst nur, das sei etwas schlecht, da einige Exceptions nicht in der Klasse, sondern in eigenständigen Prozeduren oder Class-Prozeduren auftreten können und es dann keinen Sender gäbe,

aber da hatte ich nicht weiter gedacht, da die betreffenden Exceptions ja immer in einer Klasse auftreten müssen, denn sonst gibt es die Ereignisprozeduren nicht, wo die Fehler auftreten könnten
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 12:31
Wenn ich in meinem Turbo-Delphi in System.pas nachschaue, sehe ich, dass ExceptObject auf RaiseListPtr zurückgreift, welches als threadvar deklariert ist.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 12:31
Die Variable ist auch als threadvar, nicht als var deklariert, ich weiß aber nicht seit welcher Delphiversion es das gibt und genutzt wird.

Wenn jetzt aber eine weitere Exception auftritt, dann enthält ExceptObject diese neue Exception und die alte ist verloren.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 12:39
Ich finde, Du machst Dir zu viele Gedanken um dieses 'Problem'.

Wenn ein vom Anwender zu implementierendes Event von ihm nicht entsprechend abgesichert ist, dann ist das sein Problem.

Ich erwarte als Anwender, das die Klasse ihre Arbeit dann verweigert. Wenn er (der Anwender) sich nicht an die Konvention hält, die Fehler, die dort geschehen, entsprechend zu behandeln, dann *kann* deine Klasse doch nicht einfach weitermachen. Du implizierst dann einen stabilen Systemzustand, der nicht unbedingt gegeben ist. Wohlgemerkt: Die Exception ist unerwartet.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Exception-Behandlung weiterreichen

  Alt 6. Sep 2009, 12:41
Zitat von jaenicke:
Wenn jetzt aber eine weitere Exception auftritt, dann enthält ExceptObject diese neue Exception und die alte ist verloren.
Ich glaub irgendwas in dieser Art wurde damals auch erwähnt.

Ich hab ja nun meine eigenes Exception-Klasse so weit überarbeitet, so daß z.B. bei einem Re-Raise die vorhergehenden Fehlermeldungen mit übernommen werden, außerdem wird auch außerhalb der IDE der Klassenname der Exception und andere Informationen mit angezeigt.

So kann ich die eigentlichen Fehlermeldungen recht kurz/einfach halten und es ist später dennoch erkennbar, wo die Exception nun eigentlich her kommt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:05 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