Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi NonVcl Fehler Programmweit abfangen (https://www.delphipraxis.net/127444-nonvcl-fehler-programmweit-abfangen.html)

gandime 13. Jan 2009 13:44


NonVcl Fehler Programmweit abfangen
 
Hi,
wie kann ich bei einem NonVcl Projekt Programmweit Fehler abfangen und bearbeiten?
In VCL ist es ja einfach mit application.OnException.
Hier im Forum hab ich nichts gefunden was mir geholfen hat :-(


mfg
gandime

himitsu 13. Jan 2009 13:52

Re: NonVcl Fehler Programmweit abfangen
 
Try-Except um die "Hauptprozedur"
und/oder jeweils jede einzelne Nachrichtenbearbeitung (oder nur die Releventen) in der Nachrichtenschleife per Try-Except absichern.

OnException dürfte Letzterem entsprechen.

lbccaleb 13. Jan 2009 14:09

Re: NonVcl Fehler Programmweit abfangen
 
Schau dir mal an wie Luckie das gelöst hat in seinen SFX Tools:

SFX Tools

himitsu 13. Jan 2009 14:42

Re: NonVcl Fehler Programmweit abfangen
 
Kurzfassung aus Delphi:
Delphi-Quellcode:
procedure TApplication.HandleException(Sender: TObject);
begin
  if Assigned(FOnException) then
    FOnException(Sender, Exception(ExceptObject))
  else
    ShowException(Exception(ExceptObject));
end;

procedure TApplication.WndProc(var Message: TMessage);
begin
  try
    {bearbeiten der Nachrichtenschleife}
  except
    HandleException(Self);
  end;
end;
wie gesagt, einfach die CodeTeile per Try-Except absichen, wo etwas passieren kann

und diese Try-Except-Blöcke sind üerall in der Unit Forms verteilt (vorallem fast überall, wo Ereignisprozeduren des Programmierers aufgerufen werden).

sirius 13. Jan 2009 14:45

Re: NonVcl Fehler Programmweit abfangen
 
Genau so ein Abfangen wie in der WndProc von TApplication gibt es aber auch in TControl.

gandime 13. Jan 2009 14:54

Re: NonVcl Fehler Programmweit abfangen
 
@himitsu:
Die Idee hatte ich auch aber mit try except funktioniert das leider nicht da ich den ClientSocket benutze, welcher z.B. eine fehlgeschlagene Connection direkt Programmweit auswirft.
sry hatte vergessen zu sagen das ich den ClientSocket benutze!
@lbccaleb:
In Luckies Source habe ich nichts von einer Programmweiten exception gefunden. (Ich hab den Source aber nur überflogen!)

und nochmal an die fleißigen poster^^
@himitsu nochmal:
hmh und das funktioniert Programmweit?
wie muss ich es inizialisieren?

himitsu 13. Jan 2009 15:13

Re: NonVcl Fehler Programmweit abfangen
 
Exceptions werden eigentlich nur innerhalb des entsprechenden Thread ausgelößt und natürlich dort auch behandelt.

Du mußt eigentlich nur den Thread absichern, worin dein ClientSocket läuft.

Problematisch wird's nur, wenn dort ein eigener/weiterer Thread erstellt wird und darin die Exception auftritt.
Aber im Normalfall sollte es reichen, wenn du die auf.

[add] nur blöd, wenn ClientSocket ich mal danach suche, dann bekomm ich das gefühl, als wenn der sich 'nen eigenen Thread besorgt

sirius 13. Jan 2009 15:18

Re: NonVcl Fehler Programmweit abfangen
 
Schreib mal die globale Variable Classes.ApplicationHandleException auf eine von dir definierte Methode.

Edit: Classes.ApplicationHandleException ist "procedure (Sender: TObject) of object" und wird normalerweise über die Unit Controls, welche aus der Unit Forms das Application-Objekt initialisiert, mit der Methode Application.HandleException initialisiert.
Wenn du also kein Applicationobjekt hast (also keine Unit Forms und/oder Controls) sollte das so funktionieren. Damit fängst du die Excetpions der Sockets und diverser anderer Objekte ab.

Wie hast du eigentlich die Messagebearbeitung realisiert? Da müsstest du (auch) eingreifen.

lbccaleb 13. Jan 2009 16:11

Re: NonVcl Fehler Programmweit abfangen
 
Zitat:

Zitat von gandime
@lbccaleb:
In Luckies Source habe ich nichts von einer Programmweiten exception gefunden. (Ich hab den Source aber nur überflogen!)

Schau dir mal die Unit Exceptions an, die sich dort drinn befindet..

gandime 13. Jan 2009 17:38

Re: NonVcl Fehler Programmweit abfangen
 
ok dann hab ich exceptions.pas falsch interpretiert.
Weil ich habe nirgens eine inizialisieren gefunden!
Wie funktioniert denn das ganze dingen Oo erlich gesagt verstehe ich aus der exception.pas fast kein wort!

Edit:
@sirius:
Das funktioniert super so:
Delphi-Quellcode:
program PExceptionTest;

uses
  Windows,
  ScktComp,
  Classes;

{$R *.res}

type Exception = Class (TObject)
    class procedure OnError(Sender: TObject);
end;

var
  cs:TClientSocket;
  Msg:TMsg;

class procedure Exception.OnError(Sender: TObject);
begin
  MessageBox(0, 'Error', 'moin^^', 0);
end;

begin
  CS:=TClientSocket.Create(nil);
  Classes.ApplicationHandleException:=Exception.OnError;
  cs.Host:='127.0.0.1';
  cs.port:=1234;  //kein Server unter dieser Adresse erreichbar
  cs.Active:=true;
  while GetMessage(Msg, 0, 0, 0) do
  begin
    DispatchMessage(Msg);
  end;
end.
Blos ein kleines problem besteht, das ich keine Fehler-Nachricht bekomme, worauf ich reagieren kann!
Also mit Thread funktioniert das auch.
Aber funktioniert das auch, wenn ich das gute stück in einem Thread benutze, sodas er nir Fehler von seinem Thread verwendet?


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