Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Exceptions von weit weg abfangen (https://www.delphipraxis.net/63726-exceptions-von-weit-weg-abfangen.html)

JPSelter 22. Feb 2006 08:53


Exceptions von weit weg abfangen
 
Folgendes Szenario:

Code:
procedure first;
begin
  try
    second;
  except
    dosomethingaboutit;
  end;
end;

procedure second;
begin
  dosomethingthatmightcauseanexception;
end;
Die Prozedur "second" stammt aus einer anderen Unit an der ich nichts verändern möchte. Gleichzeitig besteht aber die Gefahr, dass genau dort eine Exception geworfen wird. Die möchte ich aber abfangen, also dachte ich mir, dass die aufrufende Prozedur "first" dies tun könnte. Macht sie aber nicht. Das was ich dort in die except-Klausel schreibe, wird einfach ignoriert. Wie kann ich das lösen?

SirThornberry 22. Feb 2006 09:20

Re: Exceptions von weit weg abfangen
 
das in deinem Except wird nur ignoriert wenn kein Fehler ausgelöst wird. Woher bist du dir so sicher das der Except-Block nie ausgeführt wird? (haltepunkte etc. gesetzt?)

MaBuSE 22. Feb 2006 09:36

Re: Exceptions von weit weg abfangen
 
Code:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Dialogs;

procedure second;
begin
  case Round(Random) of
    0: StrToInt('Zwei');       // EConvertError
    1: TObject(nil).Destroy;   // Allgemeine Schutzverletzung
  end;
end;

procedure first;
begin
  try
    second;
  except
    ShowMessage('Es ist ein Fehler aufgetreten.');
  end;
end;

begin
  Randomize;
  first;
end.
Zitat:

Zitat von JPSelter
Die Prozedur "second" stammt aus einer anderen Unit an der ich nichts verändern möchte. Gleichzeitig besteht aber die Gefahr, dass genau dort eine Exception geworfen wird. Die möchte ich aber abfangen, also dachte ich mir, dass die aufrufende Prozedur "first" dies tun könnte. Macht sie aber nicht. Das was ich dort in die except-Klausel schreibe, wird einfach ignoriert. Wie kann ich das lösen?

Das sollte auf jeden Fall funktionieren!!!
Die Unit SysUtils sollte aber eingebunden werden, sonst kann es bei Fehlern statt Exceptions auch RuntimeErrors geben. Die dann das Programm direkt beenden.

JPSelter 22. Feb 2006 10:48

Re: Exceptions von weit weg abfangen
 
Zitat:

Zitat von SirThornberry
das in deinem Except wird nur ignoriert wenn kein Fehler ausgelöst wird. Woher bist du dir so sicher das der Except-Block nie ausgeführt wird? (haltepunkte etc. gesetzt?)

Erstens weil ich Exceptions bekomme und zweitens weil ich dort ein showmessage() drin habe. Hintergrund: Ich scanne einen Datenträger nach ZIP Dateien und liste mir den Inhalt auf. Einige ZIP Dateien sind aber nicht lesbar (liegt an den Units die ich verwende) und werfen eine Exception. Diese Anzahl möchte ich mitzählen, aber das geht nicht, weil er in den except-Block nicht reinspringt.

MaBuSE 22. Feb 2006 10:51

Re: Exceptions von weit weg abfangen
 
Zitat:

Zitat von JPSelter
Erstens weil ich Exceptions bekomme und zweitens weil ich dort ein showmessage() drin habe.

Welche Exception bekommst du denn?

JPSelter 22. Feb 2006 11:09

Re: Exceptions von weit weg abfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe keine Zeit um nach dem Grund für diese Exception zu suchen, daher zähle ich nur die fehlerhaften ZIPs mit und ignoriere sie.

Im Anhang eine von zwei bisher festgestellten Exceptions:

dahead 22. Feb 2006 11:25

Re: Exceptions von weit weg abfangen
 
Sieht eher so aus als liegt das Problem an einer Datei, die evtl. kein gültiges Datum für FileAge / DateTimeToStr besitzt.
Ich würde an dieser Stelle evtl. mal einen try except block verwenden.

JPSelter 22. Feb 2006 11:32

Re: Exceptions von weit weg abfangen
 
Eben genau darum geht es ja. Ich kenne die Zeile, die den Fehler verursacht, aber ich möchte in dieser Unit nichts verändern, weil es nicht meine Unit ist. Sicher kann ich da einen try-Block einfügen, aber dann bräuchte ich diesen Thread nicht erstellen.

dahead 22. Feb 2006 11:38

Re: Exceptions von weit weg abfangen
 
Zitat:

Zitat von JPSelter
Eben genau darum geht es ja. Ich kenne die Zeile, die den Fehler verursacht, aber ich möchte in dieser Unit nichts verändern, weil es nicht meine Unit ist. Sicher kann ich da einen try-Block einfügen, aber dann bräuchte ich diesen Thread nicht erstellen.

Ok, tut mir leid, da hätte ich genauer lesen sollen. Du hast ja oben schon geschrieben, dass du in der Unit (second) nichts ändern willst. Allerdings frage ich mich, warum dein try except Block in _deiner_ unit nicht greift?

dfried 22. Feb 2006 11:42

Re: Exceptions von weit weg abfangen
 
Hast du die Anwendung mal "ausserhalb" von Delphi gestartet? Kommt die Fehlermeldung dann auch?

JPSelter 22. Feb 2006 12:04

Re: Exceptions von weit weg abfangen
 
Interessant. Die Fehlermeldung kommt nur im Delphi während der Laufzeit. Normalerweise (bei anderen Programmen) kommt erst eine Delphi-Exception und wenn ich dann das Programm fortsetze bringt das Programm dieselbe Meldung nochmal. Diesmal aber nicht. Die Exception kommt NUR im Delphi... kein Wunder also, dass bei mir der Exception Block nicht durchlaufen wird. Denn das Programm erkennt keine Exception, sondern nur Delphi... aber was bringt mir dieses Wissen :D

himitsu 22. Feb 2006 12:14

Re: Exceptions von weit weg abfangen
 
Delphi bringt standardmäßig immer eine Exception (kann man aber abstellen),
deßhalb kommen bei dir sonst immer Zwei.

Diesesmal kommt aber nur die von Delphi und die vom Programm hast du per Try-Except unterbunden.

Aber warum die MessageBox nicht kommt *schulterzuck*

MaBuSE 22. Feb 2006 12:16

Re: Exceptions von weit weg abfangen
 
Zitat:

Zitat von JPSelter
Interessant. Die Fehlermeldung kommt nur im Delphi während der Laufzeit. Normalerweise (bei anderen Programmen) kommt erst eine Delphi-Exception und wenn ich dann das Programm fortsetze bringt das Programm dieselbe Meldung nochmal. Diesmal aber nicht. Die Exception kommt NUR im Delphi... kein Wunder also, dass bei mir der Exception Block nicht durchlaufen wird. Denn das Programm erkennt keine Exception, sondern nur Delphi... aber was bringt mir dieses Wissen :D

Das ist ein Standardverhalten von Delphi.
Der Debugger stoppt bei allen Exceptions, um dir die Möglichkeit zum Debuggen zugeben.
Wenn dann eine try except Anweisung kommt wird die Exception nicht zu Anwender durch.
Wenn Du den try except Block entfernst sieht auch der Anwender die Exception.

JPSelter 22. Feb 2006 12:17

Re: Exceptions von weit weg abfangen
 
Ich sehe gerade, dass die "fremde" Unit selber schon genug try-except-Blöcke hat. Dann sollte es nun klar sein, wieso es nicht klappt. 2 Verschachtelte try-except-Blöcke sind sicher nicht möglich, bzw. der innere gibt die Esception logischerweise nicht an den äusseren weiter. Dann muss ich mir etwas anderes einfallen lassen hmmmmm.

MaBuSE 22. Feb 2006 12:17

Re: Exceptions von weit weg abfangen
 
Zitat:

Zitat von himitsu
Aber warum die MessageBox nicht kommt *schulterzuck*

Warscheinlich hat er nach der Exception das Programm mit [Strg+F2] beendet :-)
Wenn er F9 gedrückt hätte um das Programm weiterlaufen zu lassen wäre die MessageBox bestimmt gekommen.

McLane 22. Feb 2006 12:18

Re: Exceptions von weit weg abfangen
 
Delphimenü -> Tools -> Debugger Optionen -> Reiter Sprach-Exceptions -> Checkbox "Bei Delphi-Exceptions stoppen" deaktivieren.

JPSelter 22. Feb 2006 12:24

Re: Exceptions von weit weg abfangen
 
Zitat:

Zitat von MaBuSE
Zitat:

Zitat von himitsu
Aber warum die MessageBox nicht kommt *schulterzuck*

Warscheinlich hat er nach der Exception das Programm mit [Strg+F2] beendet :-)
Wenn er F9 gedrückt hätte um das Programm weiterlaufen zu lassen wäre die MessageBox bestimmt gekommen.

Wohl kaum ...

MaBuSE 22. Feb 2006 13:11

Re: Exceptions von weit weg abfangen
 
Zitat:

Zitat von McLane
Delphimenü -> Tools -> Debugger Optionen -> Reiter Sprach-Exceptions -> Checkbox "Bei Delphi-Exceptions stoppen" deaktivieren.

Oder (bei D7):
Delphimenü -> Tools -> Debugger Optionen -> Reiter Sprach-Exceptions -> "Hin&zufügen..." Button drücken, EConvertError eingeben und OK drücken.

Dann bleibt der Debugger bei allen Exceptions stehen, außer bei den angegebenen :-)

Zitat:

Zitat von JPSelter
Wohl kaum ...

War ja nur eine Vermutung ;-)

Du hast Recht, bei verschachtelten try except Blöcken hast Du so gut wie keine Chance von außen an die Exception ranzukommen.

Vieleicht hat die Komponente die Du verwendest ein OnError Ereignis.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 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