Delphi-PRAXiS
Seite 2 von 2     12   

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)

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:56 Uhr.
Seite 2 von 2     12   

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