2009-10-21 3 views
23

A C# Programm wird von aufgerufen:Ist Versuch/Fang um ganzes C# -Programm möglich?

Application.Run (new formClass()); 

Ich mag würde einen try/catch um die ganze Sache zu stoppen setzen alle nicht abgefangenen Ausnahmen. Wenn ich diese Run-Methode umschreibe, werden Ausnahmen nicht abgefangen; Die Steuerung kehrt nur zurück, wenn das Programm nach einer nicht abgefangenen Ausnahme beendet wird.

Wo kann ich versuchen/fangen, um das gesamte Programm abzudecken? Vielen Dank!

+4

Ich denke, Sie vermissen den Punkt des Ausnahmeprozesses, wenn eine Ausnahme auf die oberste Ebene Ihrer Anwendung aufsteigt, dann ist etwas falsch, das unten im Code weiter unten angesprochen werden muss. Setzen Sie try/catch um den Code herum, von dem Sie glauben, dass er scheitern könnte, und sorgen Sie (wo möglich) dafür, dass der Fehler behoben wird. Wenn es nicht gemildert werden kann, d. H. Die App kann nicht wiederhergestellt werden, muss die Anwendung fehlschlagen. – Lazarus

+13

Das OP fragt nicht, wie Ausnahmen verwendet werden sollten - wie sie in einem bestimmten Szenario abgefangen werden. Offensichtlich, wenn eine Ausnahme in die oberste Ebene blubbert, dann stimmt etwas nicht - scheint, als ob er mehr Informationen herausfinden möchte, wenn etwas nicht in Ordnung ist, damit es angesprochen werden kann. Mitchs Antwort ist viel hilfreicher, als anzunehmen, dass die OP nicht weiß, was er tut. – Maggie

+9

Das Abfangen aller Ausnahmen auf der obersten Ebene kann sehr nützlich sein, um einen letzten Versuch zu unternehmen, die Ereignisse vor dem Beenden zu melden. In vielen Fällen denke ich, dass dies besser ist, als das Standard-Windows-Programm "Dieses Programm ist abgestürzt, bitte melden Sie dies an Microsoft" zu sehen. – noctonura

Antwort

37

Um die unbehandelten Ausnahmen von Windows Form abzufangen, führen Sie die Ereignisse AppDomain.UnhandledException und Application.ThreadException durch.

Von Interesse: Unexpected Errors in Managed Applications

+2

@alankdkd: Stellen Sie sicher, dass Sie bis zum Ende und dem Abschnitt "Some Best Practices" lesen;) – Lazarus

+1

Sie können keine Ausnahme mit 'AppDomain.UnhandledException' abfangen (es wird weiterhin die Anwendung beenden), sondern nur benachrichtigt werden. Dies ist ein wichtiger Unterschied im Vergleich zu "Application.ThreadException", das ein Ausnahmefehler ist. – Lucero

+0

Ich kann UnhandledException nicht funktionieren. Ich habe versucht:

 AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
Aber wenn es eine Ausnahme gibt, wird MyHandler nie aufgerufen. Ich werde versuchen ThreadException ... – user20493

8

Grundsätzlich können Sie nicht alle Ausnahmen fangen, wenn die Standard-CLR Prozess Hosting verwenden. Zeitraum. Dies liegt daran, dass das Ereignis AppDomain.UnhandledException nur eine Benachrichtigung ist. Sie können die Ausnahme nicht behandeln (was bedeutet, dass Sie nicht verhindern können, dass die Anwendung nach der Verarbeitung der Benachrichtigung beendet wird).

Sie können jedoch alle Ausnahmen im UI-Thread einer WinForms-Anwendung abfangen und behandeln, indem Sie den Handler Application.ThreadException (und control the behavior über UnhandledExceptionMode) verwenden. Andere Threads, die eine Ausnahme auslösen, werden von diesem Handler nicht erfasst.

Im Allgemeinen ist es keine gute Idee, alle Ausnahmen zu behandeln. Sie können jedoch AppDomain.UnhandledException verwenden, um den Fehler zu protokollieren und/oder wichtige Bereinigungsaufgaben auszuführen (z. B. Herunterfahren einer dateibasierten Datenbank oder was auch immer).

Verwandte Themen