Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi try-except - HandleException-Befehl (https://www.delphipraxis.net/72106-try-except-handleexception-befehl.html)

simlei 25. Jun 2006 20:20


try-except - HandleException-Befehl
 
Zitat:

An exception block that contains no exception handlers, but instead consists only of a list of statements, handles all exceptions. For example,

try
...
except
HandleException;
end;

Here, the HandleException routine handles any exception that occurs as a result of executing the statements between try and except.
...schrieb die Delphi-Hilfe so schön.
Delphi7 schreibt aber bei mir in dieser Try-Except-Routine ...

Delphi-Quellcode:
  try
  fl_colorline := getcolor(Flaechen_ColorLine.Text);
  fl_colorpt := getcolor(Flaechen_ColorPt.Text);
  line_colorline := getcolor(Linien_ColorLine.Text);
  line_colorpt := getcolor(Linien_ColorPt.Text);
  pt_colorpt := getcolor(Punkte_ColorPt.Text);

  fl_radius := StrToInt(Flaechen_Radius.Text);
  line_radius := StrToInt(Linien_Radius.Text);
  pt_radius := StrToInt(Punkte_Radius.Text);

  fl_drawline := Flaechen_Check1.Checked;
  fl_drawpt := Flaechen_Check2.Checked;
  line_drawpt := Linien_Check1.Checked;
 except
  HandleException;
  ShowMessage('EXCEPTION!!!!');
 end;
... [Error] Unit3.pas(92): Undeclared identifier: 'HandleException' ...

Warum tritt diese Meldung auf (in der Hilfe ist er doch dokumentiert)? Braucht man für dieses HandleException etwa eine bestimmte Unit? Und wenn das bei mir so nicht funktionieren sollte, steht dann hier die Frage, wie ich sonst alle Exceptions, die in dem Befehlsblock zwischen Try und Except auftreten, blocken kann (sie erscheinen nicht auf dem Bildschirm) und dafür dann eigene Maßnahmen zur Behandlung des Fehlers ergreifen kann (Hier als Beispiel die Ausgabe in ShowMessage).

TheAn00bis 25. Jun 2006 20:23

Re: try-except - HandleException-Befehl
 
Vielleicht "Application.HandleException;" ?

simlei 25. Jun 2006 20:33

Re: try-except - HandleException-Befehl
 
hmm. da gibt es tatsächlich ein "HandleException(Sender:TObject)" - aber in der Delphihilfe waren ja keine Parameter verlangt. Funktioniert dieses auch? bzw. wenn ja was muss das TObject sein? Das Form, in dem die Exception verursacht wird? (oder was sonst?)

Nachtrag... wenn ich als Sender Form3 nehme (der Delphi-Code steht im Form3) dann kommt trotzdem ne Exception...

TheAn00bis 25. Jun 2006 20:37

Re: try-except - HandleException-Befehl
 
Übergib einfach "nil", der Parameter ist überflüßig.

Muetze1 25. Jun 2006 20:39

Re: try-except - HandleException-Befehl
 
Ähm, euch ist doch hoffentlich klar, das das Pseudocode ist. Die Delphi Hilfe will mit "HandleException" darauf hinweisen, dass man dort die Exceptions handeln soll. Es geht hier nicht um den Aufruf einer Funktion.

Die Application.HandeException() wird eh immer aufgerufen, wenn eine Exception bis nach ganz "oben" durchschlägt.

simlei 25. Jun 2006 20:40

Re: try-except - HandleException-Befehl
 
Hmm. das mit dem nil hat nmicht geklappt... Und wenn das ein Pseudocode ist, wie kann ich mein Ziel nun erreichen?

Muetze1 25. Jun 2006 20:42

Re: try-except - HandleException-Befehl
 
Zitat:

Zitat von simlei
Hmm. das mit dem nil hat nmicht geklappt... Und wenn das ein Pseudocode ist, wie kann ich mein Ziel nun erreichen?

Behandle an der Stelle die Exceptions! Was fehlt dir denn nun noch? Schmeiss dort die ShowMessage aus oder vllt. auch noch den Klassennamen und Meldungstext der Exception - aber was nun noch? Was ist dir unklar? Was fehlt dir?

Möglichkeit 1:
Delphi-Quellcode:
Try
  ...
Except
  On E: Exception Do
    ShowMessage(Format('Exception %s aufgetreten: %s', [E.ClassName, E.Message]));
End;
Möglichkeit 2:
Delphi-Quellcode:
Try
  ...
Except
  ShowMessage(Format('Exception %s aufgetreten: %s', [Exception(ExceptObject).ClassName, Exception(ExceptObject).Message]));
End;

simlei 25. Jun 2006 20:44

Re: try-except - HandleException-Befehl
 
ich will - siehe oben - dass das Exceptionfenster nicht mehr angezeigt wird.

Muetze1 25. Jun 2006 20:46

Re: try-except - HandleException-Befehl
 
Zitat:

Zitat von simlei
ich will - siehe oben - dass das Exceptionfenster nicht mehr angezeigt wird.

Wird es doch auch nicht. Starte die EXE vom Explorer aus und staune...

Nur um die Exception Meldung zu unterdrücken kannst du den Except/End Block leer lassen. Damit werden die Exceptions abgefangen und schlagen sich nicht mehr eine Ebene höher durch. Das die Exceptionmeldung in der IDE angezeigt wird ist ganz normal. Entweder schaltest du dies Verhalten in der IDE ab oder du kontrollierst deine EXE in dem du sie vom Explorer aus startest.

TheAn00bis 25. Jun 2006 20:46

Re: try-except - HandleException-Befehl
 
Warum Pseudocode? Ohne "Application.HandleException" erfährt der User doch nicht, welche Exception ausgelöst wurde.

Wenn ich "Application.HandleException" in meinen Programmen nutze sagt mir eine MessageBox, welche Exception auftrat, ohne wird sie einfach "verschluckt".

simlei 25. Jun 2006 20:50

Re: try-except - HandleException-Befehl
 
SUPER (Beispiel 1 hat mir zugesagt)
da wäre auch gleich meine nächste Frage mitbeantwortet, wie ich die Ursache der Exception rauskriege...

Vielen Dank für die schnelle Hilfe - hat ja insgesamt nur ca. 10min gedauert!!

Muetze1 25. Jun 2006 20:50

Re: try-except - HandleException-Befehl
 
Zitat:

Zitat von TheAn00bis
Warum Pseudocode? Ohne "Application.HandleException" erfährt der User doch nicht, welche Exception ausgelöst wurde.

Wenn ich "Application.HandleException" in meinen Programmen nutze sagt mir eine MessageBox, welche Exception auftrat, ohne wird sie einfach "verschluckt".

Genau das will er erreichen.

Und wenn du die Exception anzeigen lassen willst, dann brauchst du kein Exception Handler - der von Application kommt dann eh zum tragen. Die Methode von Application die du da aufrufst wird standardmässig dem Application.OnException zugewiesen um alle nicht behandelten Exceptions anzuzeigen.

TheAn00bis 25. Jun 2006 20:56

Re: try-except - HandleException-Befehl
 
Zitat:

Zitat von Muetze1
Und wenn du die Exception anzeigen lassen willst, dann brauchst du kein Exception Handler - der von Application kommt dann eh zum tragen. Die Methode von Application die du da aufrufst wird standardmässig dem Application.OnException zugewiesen um alle nicht behandelten Exceptions anzuzeigen.

Demnach macht es ja keinen Unterschied, ob ich es aufrufe oder nicht. Aber wenn ich

Delphi-Quellcode:
procedure xyz;
var i: integer;
begin
  try
    i := strtoint('a');
  except
    Application.HandleException(nil);
  end;
end;
schreibe wird mir die Exception (auch ohne Debugger) angezeigt und wenn ich das "Application.HandleException(nil);" auskommentiere, dann nicht. Wenn es aber doch so oder so aufgerufen wird, warum wird mir dann nur im ersten Fall auch die Exception angezeigt?

Muetze1 25. Jun 2006 20:59

Re: try-except - HandleException-Befehl
 
Die Frage ist: in welchem Kontext rufst du die Procedure auf?

Dann wäre zum reinen Anzeigen der Exception wohl Application.ShowException() besser geeignet, oder?

TheAn00bis 25. Jun 2006 21:05

Re: try-except - HandleException-Befehl
 
Zitat:

Zitat von Muetze1
Die Frage ist: in welchem Kontext rufst du die Procedure auf?

Dann wäre zum reinen Anzeigen der Exception wohl Application.ShowException() besser geeignet, oder?

Mir ging es weniger darum, was besser wäre als zu verstehen, warum wenn das "Application.HandleException" so oder so aufgerufen wird nur wenn ich es explizit aufrufe die Messagebox erscheint.
Spielt der Kontext eine Rolle? Ich hatte jetzt an ButtonClick oder ähnliches gedacht.

Hawkeye219 25. Jun 2006 21:09

Re: try-except - HandleException-Befehl
 
Wenn du zwischen EXCEPT und END nichts hinschreibst, vernichtest du alles auftretenden Exceptions. Siehe hier

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz