![]() |
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 |
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. |
Re: NonVcl Fehler Programmweit abfangen
|
Re: NonVcl Fehler Programmweit abfangen
Kurzfassung aus Delphi:
Delphi-Quellcode:
wie gesagt, einfach die CodeTeile per Try-Except absichen, wo etwas passieren kann
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; und diese Try-Except-Blöcke sind üerall in der Unit Forms verteilt (vorallem fast überall, wo Ereignisprozeduren des Programmierers aufgerufen werden). |
Re: NonVcl Fehler Programmweit abfangen
Genau so ein Abfangen wie in der WndProc von TApplication gibt es aber auch in TControl.
|
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? |
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 |
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. |
Re: NonVcl Fehler Programmweit abfangen
Zitat:
|
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:
Blos ein kleines problem besteht, das ich keine Fehler-Nachricht bekomme, worauf ich reagieren kann!
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. 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 02:16 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