Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi try ... except ... finally ... ~ funktionieren nicht ? (https://www.delphipraxis.net/144754-try-except-finally-%7E-funktionieren-nicht.html)

Cicaro 15. Dez 2009 22:24


try ... except ... finally ... ~ funktionieren nicht ?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo.

Das Problem, dass ich habe, ist einfach ich komme nicht in meinen Except-Block bei der Exception-Behandlung hinein.

Beispiele im Anhang.

Der Fehler tritt immer dann auf, wenn der Client versucht mit dem Server zu verbinden, wobei der Server down ist. Mir wirft der Debugger nur die Fehlermeldung aus. Wenn ich den Debugger ausschalte, wirft mir das OS die passende Fehlermeldung aus. Ich möchte den Fehler aber selber behandeln. Das geht halt nicht. Ich wär ja schon froh, wenn ich etwas falsch gemacht habe, aber ich habe mir schon ein paar Muster in der Delphi Hilfe und im Netz angeschaut. Sie sehen alle gleich aus und wie meine.

Was stimmt also nicht ?

MfG

Christian Seehase 15. Dez 2009 22:32

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
Moin Cicaro,

tritt der Fehler auch auf, wenn das Programm nicht aus der IDE heraus gestartet wird?

Damit aus der IDE heraus gestartet keine Exceptions gezeigt werden, muss man in

Extras\Debugger Options\Sprach-Exceptions\

die Checkbox Stop bei Debugger Exceptions deaktiviert werden.

Die Angabe stimmt nicht genau, da ich ein englisches Delphi habe.
Ich hoffe, es reicht, um die Stelle zu finden ;-)

Cicaro 15. Dez 2009 22:37

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
Es ist egal wie ich die Anwendung starte, ob Explorer oder IDE, es bleibt dabei, dass der Fehler vom System bzw der IDE gemeldet wird. Ich kann keine Exceptions abfangen. Habs auch mit EDivByZero ausprobiert. Geht auch nicht.

Namenloser 15. Dez 2009 22:44

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
Seltsam. Was passiert, wenn du den on-do-Block weglässt?

Cicaro 15. Dez 2009 22:52

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
Genau dasselbe. Hab schon den Debugger deaktiviert, dann wird die Exception vom System gemeldet.

Sherlock 16. Dez 2009 07:28

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
Hmmm, also die beiden Messageboxen, die Du da zeigst, sind offensichtlich Debugger-Meldungen. WEnn Du nicht noch mit irgendwelchen (mir nicht bekannten) Compilerdirektiven rumgespielt hast, dürfen diese Meldungen nicht kommen, wenn Du Deine EXE ausserhalb der IDE startest. Das muss so sein, sonst wäre mein Bild von Delphi tief gestört.

Sherlock

Angel4585 16. Dez 2009 07:47

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
Wie sieht die Meldung aus, wenn du die exe-Datei direkt im explorer startest, ohne IDE?

himitsu 16. Dez 2009 07:56

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
Wenn Quelltexte schon als Bilder, dann bitte auch in den Anhang damit.
(imageshack löscht ja irgendwann mal diese Bilder ... dann sind sie weg und dieses Thema ist keine Hilfe mehr für Andere, weil etwas wichtiges fehlt)



Versucht mal alle exceptions abzufangen
Delphi-Quellcode:
try

except
  on E: Exception do
    Caption := Exception(E).Message;
end;
oder
Delphi-Quellcode:
try

except
  Caption := Exception(ExceptObject).Message;
end;
[edit]
upps, also im Beispiel 2 sollte zumindestens das Beep aufgerufen werden.

Zitat:

Wie sieht die Meldung aus, wenn du die exe-Datei direkt im explorer startest, ohne IDE?
Da dieses Debuggerexceptions sind, werden diese nicht außerhalb eines Debuggers angezeigt
Und da er die Exceptions komplett abfängt, sollte da auch nichts Anderes sichtbar sein.

Cicaro 16. Dez 2009 23:12

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
(Ich hab die Bilder ganz oben nochmal in den Anhang getan, damit sie nicht gelöscht werden.)

Der Code aus "except2.png" kann ganz einfach an jeder Stelle im Standard-Programm von Delphi getestet werden. Kann mir bitte jemand sagen, ob er auch die Debugger-Fehlermeldung bekommt oder in den Except-Block hineinkommt (mit Debugger auf an) ?

Ansonsten tritt der komische Fehler bei mir nicht zum ersten Mal auf. Ich hatte bloß keinen Nerv mich früher darum zu kümmern.

Luckie 17. Dez 2009 02:42

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
Wie willst du bei dem Code in den Except-Block kommen, wenn du im Try-Block eine Exception wirfst?

hoika 17. Dez 2009 06:44

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
Hallo,

warum schreibst du nicht gleich,
dass Caption bei der Exception nicht gesetzt wird ?
Dann muss man sich nicht durch Screenshots hangeln ! tztz

Zitat:

Wenn ich den Debugger ausschalte, wirft mir das OS die passende Fehlermeldung aus
Hier wäre ein Screenshot hilfreich.


Mal ein einfaches Bsp.
Neues Projekt erstellen
Timer aufs Form und in OnTimer rein.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Beep;

  try
    raise Exception.Create('bla');
  except
    Caption:= 'argz';
  end;
end;

end.
Er piept und es wird argz angezeigt.
Um eine Exception zu erzeugen, reicht es übrigens nicht, einfach

Delphi-Quellcode:
Exception.Create('bla');
Ohne das raise passiert gar nichts, ausser ein Speicherleck.


Heiko

Cicaro 17. Dez 2009 19:59

Re: try ... except ... finally ... ~ funktionieren nicht ?
 
So hab den Fehler selber behoben.

Das Problem dabei ist, dass sich einige Exceptions nicht durch "try ... except ..." abfangen lassen, weil sie nicht im Stack des aktuellen Prozesses auftreten. Bei ClientSocket.Open() wird ein neuer Thread mit eigenem Stack instantiiert und dieser kann dann die Exception auslösen. Diese Exception kann man über ein Ereignis abfangen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp;

type
  TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
  public
    procedure SocketErrorBehandlung(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormClick(Sender: TObject);
var
  Client: TClientSocket;
begin
  Client := TClientSocket.Create(Self);
  Client.Host := 'localhost';
  Client.Port := 12345;
  Client.OnError := SocketErrorBehandlung; // für die Fehlerbehandlung
  Client.Open(); // <- hier wird der Thread gestartet, der den Fehler/Exception auslösen kann
end;

procedure TForm1.SocketErrorBehandlung(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  // hier wird der Fehler behandelt
  Form1.Caption := 'Fehler ist eingetreten, aber behandelt!';
  ErrorCode := 0;
end;

end.
Das gilt zunächst einmal für Delphi 7, denk ich mal.
Ich bin drauf gekommen, weil die Exception nicht exakt zu dem Zeitpunkt auftritt, als Client.Open() ausgeführt wird.


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