Frage

ich eine nicht behandelte Exception-Handler haben. Es zeigt eine nette GUI und ermöglicht es Benutzern, einen Fehlerbericht zu senden. Benutzer können sogar ihre Namen und die Telefonnummer und die Dinge, und unsere Support-Abteilung fordert sie wieder verlassen. Funktioniert gut, sieht gut aus, macht Kunden weniger wütend. Theoretisch jedenfalls.

Das Problem ist, dass meine Anwendung verwendet Hintergrund-Threads, und die Fäden nicht zu kümmern scheinen, wenn eine Ausnahme auf geworfen wurde, sagen wir, die GUI-Thread (was Sinn macht), und nur ihre Arbeit fortsetzen. Die schließlich führt zu einem Dialog WER poping, wenn der Benutzer meines benutzerdefinierten Exception-Handler Fenster Aufenthalt kann lange genug offen, so dass es wie die Fehlerbehandlung aussieht selbst abgestürzt ist.

Ich habe keinen Zugriff auf die Thread-Objekte in dem Rahmen der Exception-Handler, so dass ich sie nicht unterbrechen kann. der Faden zu machen Objekte global zugänglich ist entweder keine Lösung. Meine Abhilfe für jetzt ist in meinem Exception-Handler so etwas wie Globals.Crashed = true; zu verwenden, und meine Thread Methoden prüfen bei jeder Schleifeniterationslatenzzeit dieser Eigenschaft zu haben. Nicht perfekt, aber es minimiert den Schaden.

Kennt jemand eine weniger hacky Methode? Ist mein Ansatz falsch? Muss ich es tun wie WER tut, und starten Sie ein externes Programm, das das Hauptprogramm und zeigt die Fehler UI aussetzt?

War es hilfreich?

Lösung

Wenn Sie eine nicht behandelte, unbekannte Ausnahme haben, können Sie davon ausgehen, dass alles, was ist passiert hat und dass Ihr Programm scheitern könnte sogar die einfachste Sache zu tun. Betrachten Sie zum Beispiel der Fall, dass es den gesamten verfügbaren Speicher verbraucht hat -. dann werden Sie auch nicht in der Lage den Fehlerbericht zu senden, weil es wahrscheinlich Speicher erfordert zugewiesen werden

Ein guter Ansatz ist es, eine getrennt kleine Anwendung zu schreiben, die die Fehlerberichterstattung nur der Fall ist. Dieser Antrag kann die Details Bericht aus einer Datei aufzunehmen. Auf diese Weise Ihren unbekannten Exception-Handler würde:

  • Dump die Informationen in eine Datei im temporären Verzeichnis.
  • Starten Sie die Fehlerberichterstattung App mit dem Dateinamen als Argument.
  • Beenden Sie den fehlerhaften Prozess, bevor sie etwas Dummes tut.

Die temporäre Datei sollte durch die Fehlerberichterstattung App entfernt werden.

Andere Tipps

Sie konnten alle Threads in einem globalen Collection-Objekt verfolgen, so dass, wenn der Handler ausgeführt wird, es könnte einfach eine Iteration durch das Sammelobjekt und Abbruch der Fäden dort.

Werfen Sie einen Blick auf den Code in dieser Frage Suspend-Prozess in C # , Sie‘ ll Notwendigkeit, es zu zwicken, um nicht Ihre GUI-Thread aussetzen und alle, die nicht in den Hintergrund diejenigen sind Sie haben damit begonnen, aber es sollte den Trick tun.

Die bessere Option ist jedoch zu versuchen und Ihren Fehlerbericht GUI als separaten Prozess gestartet, alle erforderlichen Informationen, um es vorbei, und dann den ursprünglichen Prozess von Ihren unhandled Exception-Handler zu töten, statt zuzulassen, dass alles in einem laufen potenziell korrupten Staat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top