Wie bekomme ich den WinForms zu stoppen schweigend ignorieren, nicht behandelte Ausnahmen?

Dies ist immer extrem irritierend. Jetzt habe ich eine winforms-Anwendung, und die Dinge waren nicht richtig, aber wurden keine Ausnahmen geworfen wird, soweit ich das sehen konnte. Nachdem wir durch fast alle Stücke der relevante code, es stellt sich heraus, dass eine Ausnahme geworfen wird, beim start meiner Anwendung.

Lange Geschichte kurz, in WinForms wird so genial, wie es ist, wenn eine Ausnahme Auftritt, wird die WinForms-Bibliothek, die es ignoriert. Nein "eine nicht behandelte Ausnahme ist aufgetreten" JIT-Meldung ausgelöst wird, wird es einfach beendet die Verarbeitung des aktuellen Ereignisses und geht zurück auf die GUI.

Dadurch verursacht wird, dass zufällige Fehler, da der code für das laden der Daten wird nicht genannt wegen der Ausnahme, die vor diesen Daten, die geladen werden.

Um dies in Aktion zu sehen, die ich erstellt eine neue WinForms-Anwendung, und trat in den folgenden code:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        string blah = null;
        blah.Trim();
    }
}

F5 drücken und das Formular geladen wird, ohne irgendwelche Fehler zu zeigen, auch wenn ein null-Verweis wird geworfen.

Dann habe ich versucht, zu gehen, um meine Program.cs main-Methode, und fügen Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); zu. Immer noch mein Formular geladen, ohne dass irgendwelche Fehler geworfen werden.

Obwohl ich weiß, dass ich sagen kann VS zu brechen, auf alle Ausnahmen, ich finde diese situation wirklich schlecht. Es bewirkt, dass wirklich seltsame Fragen, die sind schwer zu Debuggen, in der Produktion, und dies ist ein internes tool, das ich wirklich haben wollen, es so dass es tatsächlich Fehler aus, wenn eine Ausnahme Auftritt, und nicht schweigend ignoriert es.

Weiß jemand, wie dies zu tun?


Update: Nur update auf Dinge, die ich gelernt habe, aus den Kommentaren.

Dieser nicht erscheint, um eine 64-bit-Problem mit windows, als ich erfuhr, aus diese Frage, die ich nicht sehen, bevor du postest. In dieser Frage zeigte auf eine Microsoft bug-report über diese, was hatte dies zu sagen:

Hallo,

Dieser bug wurde geschlossen, die als "Externe", da dieses Verhalten ergibt sich aus wie die x64-version von Windows, die Ausnahmen behandeln. Wenn ein Benutzer-Modus-Ausnahme kreuzt ein kernel-übergang, x64-Versionen von Windows erlauben nicht die Ausnahme zu verbreiten. Daher angehängten Debugger sind nicht der Tatsache bewusst, dass eine Ausnahme aufgetreten, was in der debugger scheitern zu brechen, auf die nicht behandelte Ausnahme.

Leider, wo es nichts, dass die Visual Studo-team tun können, um dieses Problem anzugehen, ist es das Ergebnis des Betriebssystem-design. Alle Rückmeldungen zu diesem Thema richten Sie bitte an das Windows-team, aber das Windows-team ist der Auffassung, dass dies die "richtige" Betriebssystem-design, und ist der Auffassung, die x86-Verhalten "falsch".

Beste Grüße,
Visual Studio-Debugger

Dass gesagt wird, baut Sie sich mit visual studio (oder mit Strg+F5, um zu starten) scheint zu zeigen, die JIT-Ausnahmemeldungsfeld AUßER, wenn Sie den folgenden code in Ihre Program.cs:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

Dieser code wird dazu führen, dass windows ignorieren die Ausnahme.

Allerdings, wenn du (stattdessen) abonnieren Application.ThreadException Veranstaltung, werden nicht nur Ihre Ausnahmen gefangen werden, die visual studio-debugger wird brechen auf nicht behandelte Ausnahmen!!!

  • haben Sie versucht, zu abonnieren Anwendung.UnhandledException ?
  • schlechte Idee, IMHO ...ich habe das einmal ...
  • Sind Sie sicher, dass Sie abonnieren Sie die Form.Load-Ereignis? ...nur ein sanity-check 😉
  • möglich, Duplikat der VS2010 nicht zeigen, nicht behandelte exception in einer 64-bit-WinForms-Anwendung
  • Interessanter link, und zwar alles stimmt, diese Frage, meine Plattform ist bereits auf x86 und es doesn ' T fix it
  • war es nicht eine Idee, es war eine Frage 🙂
  • OMG das hat mir gerade geholfen, so viel geschätzt!
  • Auch wenn der code kompiliert wird, um target-x86, aber auf einem x64-computer die Fehler auftreten

InformationsquelleAutor KallDrexx | 2011-09-27
Schreibe einen Kommentar