2009-03-08 4 views
1

Ich möchte etwas wie eine "catch-all" für Ausnahmen aus einem Steuerelement oder einem Formular innerhalb der aktuellen Thread geworfen haben, aber ohne Rückgriff auf die Verwendung der Application.ThreadException des gesamten Threads.Gibt es in C# eine Möglichkeit, alle Ausnahmen von einem Steuerelement/Formular abzufangen?

Warum? Weil ich die Ausnahmebehandlung modular halten möchte.

Der gesamte Code, der die Probleme verursachen kann, wird in einem Formular (DummyForm) ausgeführt, das innerhalb des aktuellen Threads ausgeführt wird. Ich möchte in der Lage sein, alle von ihnen in eine andere Ausnahme (DummyFormException) zu wickeln, die dieses Formular als Ursache der Ausnahme identifizieren würde, so dass, wenn diese Ausnahme es auf die Application.ThreadException schafft, kann ich die Bereinigung wissen schließt schließen DummyForm.

Die Alternativen, wie ich sie sehe, sind:

# Wrap jede einzelne geworfen Ausnahme in der DummyForm mit einem DummyFormException. Ich mag das nicht so sehr, da zukünftige Programmierer sich daran erinnern müssen, jede ausgelöste Ausnahme ebenfalls zu umbrechen. # Führen Sie die DummyForm in einem eigenen Thread, und verwenden Sie Application.ThreadException, um sie zu fangen, und identifizieren Sie den Thread in diesem Code. Sobald ich weiß, woher es kommt, könnte ich einfach die DummyForm schließen und den Thread beenden.

Gibt es eine Möglichkeit, dies ohne Multi-Threading zu tun? Ich würde es hassen, es scheint eine Verschwendung nur für die Fehlerbehandlung zu sein. Oder mache ich das alles falsch?

Antwort

4

Ich bin mir nicht sicher, ob es eine gute Idee ist, den gesamten Fehlerbehandlungscode an einem einzigen Ort zu platzieren.

Fehlerbehandlung sollte besser neben der Operation durchgeführt werden, die es behandelt.

Der Hauptpunkt der Fehlerbehandlung ist das Ändern des Programmverhaltens, bei dem das Programm einen Fehler feststellt. Dies bedeutet, dass Sie haben spezifischen Code an diesem Ort schreiben, und dass Sie nicht alles nur an einem Ort, wie Sie scheinen möchten, zu setzen.

Aber vielleicht, was Sie brauchen, ist nur eine Hilfsmethode Sachen zu protokollieren, usw.


Unbehandelte Ausnahmen Handler (Application.ThreadException, AppDomain.CurrentDomain.UnhandledException) zu tun gibt, aber das ist nicht das, was sie sind für.

Sie sollten diese verwenden, um unerwartete Ausnahmen zu behandeln, dh etwas falsch aufgetreten ist, dass Sie nicht gedacht haben, und Sie möchten diesen Fall gut behandeln (Zum Beispiel können Sie den Fehler protokollieren, oder eine nette anzeigen Fehlerfeld für den Benutzer, oder sanft schließen Sie das Programm)

Wenn Sie wissen, eine Ausnahme kann irgendwo auftreten, , dass "irgendwo" ist der gute Ort, um Ihre Ausnahmebehandlung Code schreiben.

+0

Ich denke, es gibt keinen Zauberstab, nicht wahr? Vielen Dank! – scraimer

+0

@ Scraimer: Nun, es gibt einen Zauberstab (ThreadException, UnhandledDomainException zum Beispiel). Aber es gibt eine Rolle, unerwartete Ausnahmen zu fangen. Wenn Sie irgendwo eine Ausnahme erwarten, sollten Sie Ihren Code für die Ausnahmebehandlung schreiben, nicht in den globalen Handlern! – Brann

2

zu Brann anhören, sonst könnte man auf thedailywtf.com am Ende :-)

es zu einem globalen Fehlerhandler Verlassen finden Sie alle Arten von Schmerzen verursachen. Stellen Sie sicher, dass Ausnahmen in Ihrer Anwendung an der Quelle an der Quelle behandelt werden - das ist der Punkt, an dem Sie die richtigen Informationen haben, um zu entscheiden, wie Sie damit umgehen sollen.

+0

Nun, es ist immer noch eine gute Idee, unerwartete Ausnahmen global zu erfassen. –

Verwandte Themen