Alle meine Kenntnisse zu diesem Thema ist aus diesem Artikel hier entnommen: http://msdn.microsoft.com/en-us/magazine/cc793966.aspx - Bitte beachten Sie, es ist für .NET 2.0 geschrieben, aber ich habe das Gefühl, es macht Sinn für das, was wir in diesem Fall erlebt haben (mehr als "weil es beschlossen,“sowieso)
Quick‚ich habe nicht Zeit, dass Artikel‘Antwort zu lesen (obwohl Sie sollten, es ist ein wirklich gut ist):
die Lösung für das Problem (wenn Sie absolutly von Ihnen haben, schließlich blocks run) wäre, a) in einen globalen Fehlerhandler zu setzen oder b) .NET zu zwingen, immer endlich Blöcke laufen zu lassen und die Dinge so zu machen (wohl in die falsche Richtung) in .NET 1.1 - Platziere folgendes in deiner App .config:
<legacyUnhandledExceptionPolicy enabled="1">
Der Grund dafür: Wenn eine Ausnahme in .NET ausgelöst wird, beginnt es wieder durch den Stapel zu Fuß suchen Handler Ausnahme und wenn es eine findet es tut dann einen zweiten Weg zurück durch den Stapel läuft schließlich Blöcke vor läuft der Inhalt des Fangs. Wenn es keinen Catch findet, wird dieser zweite Weg nie ausgeführt, also werden die finally Blöcke niemals hier ausgeführt, weshalb ein globaler Ausnahmehandler immer finally-Klauseln ausführen wird, da die CLR sie ausführt, wenn sie den Catch findet, NICHT wenn er ihn ausführt (was ich glaube, bedeutet, auch wenn Sie einen Fang/werfen Sie Ihre endgültigen Blöcke werden immer noch laufen).
Der Grund für die Funktion app.config ist, weil für .NET 1.0 und 1.1 die CLR einen globalen Haken hatte, der Exceptions schlucken würde, bevor sie unmanaged würden, was natürlich ein Fang wäre, die endgültigen Blöcke auszulösen Lauf. Natürlich gibt es keine Möglichkeit, dass das Framework genug über diese Exception wissen kann, um es zu handhaben, nehmen Sie zum Beispiel einen Stack-Überlauf, also ist dies wahrscheinlich der falsche Weg, dies zu tun.
Das nächste Bit ist, wo es ein bisschen klebrig wird, und ich mache Annahmen basiert auf, was der Artikel hier sagt.
Wenn Sie in .NET 2.0 + ohne die traditionelle Ausnahmebehandlung arbeiten, dann würde Ihre Exception in das Windows-Ausnahmebehandlungssystem (SEH) fallen, das der CLR sehr ähnlich ist, da es durch Frames läuft bis es keinen Catch findet und dann eine Reihe von Ereignissen namens Unhandled Exception Filter (UEF) aufruft.Dies ist ein Ereignis, das Sie abonnieren können, aber es kann immer nur EINE Sache abonniert haben. Wenn also etwas Windows abonniert, übergibt es die Adresse des Rückrufs, der vorher dort war, und erlaubt Ihnen, eine Kette von UEF einzurichten Behandler - ABER SIE MÜSSEN DIESE Adresse NICHT HONNEN, sie sollten die Adresse selbst anrufen, aber wenn man die Kette bricht, bap, erhält man keine Fehlerbehandlung mehr. Ich nehme an, dass dies passiert, wenn Sie die Windows-Fehlerberichterstattung abbrechen, die UEF-Kette bricht, was bedeutet, dass die Anwendung sofort heruntergefahren wird und die endgültigen Blöcke nicht ausgeführt werden. Wenn Sie sie jedoch bis zum Ende laufen lassen und schließen, Es ruft den nächsten UEF in der Kette auf. .NET hat eine registriert, von der die AppDomain.UnhandledException aufgerufen wird (also auch dieses Ereignis ist nicht garantiert) was ich davon ausgehe ist auch, wo Sie Ihre zuletzt aufgerufenen Blöcke abrufen - da kann ich nicht sehen, wenn Sie nie übergehen Zurück in die CLR kann ein gemanagter finally-Block ausgeführt werden (der Artikel geht nicht in dieses Bit.)
Wenn ich das mit .NET 4 kompiliere und es ausführe, erhalte ich den Standard-Windows-Fehlerbericht; Wenn ich das schließe oder auf "Nicht senden" klicke, druckt die Konsole "in Endlich" aus. Scheint gut zu funktionieren! –
Führen Sie dies von Visual Studio aus? Versuchen Sie es manuell über die Eingabeaufforderung auszuführen. –
Es könnte auch einen Unterschied zwischen 64/32 Systemen geben. – Kobi