2009-08-07 4 views
0

Ich habe viele asynchrone Operationen in verschiedenen Klassen.So fangen Sie eine Ausnahme in WinForms, wenn viele asynchrone Vorgänge vorhanden sind

Bei einem Fehler wird eine spezielle Ausnahme ausgelöst, die von System.Exception geerbt wird.
In irgendeiner Form möchte ich es von messageBox abfangen.

Die Funktion "Application.ThreadException" kann es nicht abfangen.

Mit anderen Worten, ich kann nicht alle Ausnahmen von der Funktion abfangen, wenn eine Ausnahme ausgelöst wird Wie kann ich tun?

Antwort

4

abonnieren Anwendung .UnhandledException wird bei jeder nicht behandelten Ausnahme ausgelöst und macht das Ausnahmeobjekt mit Details in EventArgs verfügbar.

2

Grundsätzlich sollten Sie Ausnahmen pro Thread behandeln, mit Application.ThreadException als letztes Mittel.

Wie das zu tun, hängt davon ab, was Async Muster, das Sie verwenden, aber zum Beispiel bei der Verwendung von IAsyncResult die Ausnahme für Sie ‚gespeichert‘ wird geworfen, wenn Sie EndIvoke nennen (.., IAR)

+0

zB können wir Ausnahme und umleiten Seite auf die Fehlerseite in ASP.net durch Festlegen der Fehlerdaten in web.config. wie in winform zu tun? –

0

Wie Henk Holterman bereits vorgeschlagen hat, sollten Sie Ausnahmen behandeln. Nur die bösartigen, die nicht behandelt werden, sollten für Application.ThreadException verlassen werden. Falls Sie das nicht wissen, können Sie Ihre Nachricht zwar in der Ereignisbehandlungsmethode Application.ThreadException anzeigen, die Anwendung wird dann jedoch beenden. Bestimmte Ausnahmen werden nicht von Application.ThreadException abgefangen und Sie müssen mit AppDomain.UnhandledException Event umgehen. AFAIK Es ist am besten, keine Ausnahmen in Async-Handlern zu werfen (Gurus, korrigiere mich, wenn ich falsch liege). Der beste Weg, um mit ihnen umzugehen, wäre, Ausnahmen auszulösen, wenn Benutzeraufrufe enden oder wenn der Benutzer versucht, Antwortobjekte abzurufen. Bitte beachten Sie, wenn Sie throw exc Objekt von einem Thread wird es nicht in einem anderen Thread gefangen werden. Um also den Haupt-Thread zu informieren, würde man ein Ereignis auslösen (an dem sich der Haupt-Thread beteiligt hat), an dem Sie das Antwort-Objekt übergeben. Wenn ein Fehler aufgetreten ist, lösen Sie eine Ausnahme im Getter des Antwortobjekts aus, andernfalls geben Sie das Antwortobjekt zurück. Ein anderer Weg wäre, nur ein Ereignis auszulösen, das dem Hauptthread nur die Ausnahme mitteilt.

EDIT: einfach Ihren Kommentar sah:

wir Ausnahme fangen und Seite der Error in asp.net von Einstellung der Fehlerdaten in web.config umleiten. wie in winform zu tun?

Es gibt keinen direkten Weg, es in winforms zu tun. Die Art, wie ich es mache, ist eine HandleError-Methode pro Thread. Diese Methode akzeptiert das Exception-Objekt als Parameter und prüft den Typ der Exception, um ein Meldungsfeld anzuzeigen und/oder zu protokollieren.

0

Ausnahmen sind in ASync-Anwendungen fehlerhaft, da Ausnahmen nur über alle Threads (von MSDN) hinweg einzeln verarbeitet werden können. Momentan können Sie mit Events/Delegates umgehen.

VS2010 verfügt über einen neuen Ausnahmebehandler für die Behandlung von Multithread-Ausnahmen.

Verwandte Themen