2010-04-12 4 views
2

J'étudie un peu comment les exceptions non gérées sont gérées dans .Net et j'obtiens des résultats inattendus que je voudrais partager avec vous pour voir ce que vous en pensez.Capture d'exceptions non gérées dans .Net 2.0. Mauvais événement appelé

Le premier est assez simple à voir. J'ai écrit ce code pour faire le test, juste un bouton qui renvoie une exception sur le même thread qui a créé le formulaire:

Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Throw New Exception() 
    End Sub 

    Private Sub UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs) 
     MsgBox(String.Format("Exception: {0}. Ending: {1}. AppDomain: {2}", CType(e.ExceptionObject, Exception).Message, e.IsTerminating.ToString(), AppDomain.CurrentDomain.FriendlyName)) 
    End Sub 

    Private Sub UnhandledThreadException(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs) 
     MsgBox(String.Format("Exception: {0}. AppDomain: {1}", e.Exception.Message(), AppDomain.CurrentDomain.FriendlyName)) 
    End Sub 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledException 
     AddHandler Application.ThreadException, AddressOf UnhandledThreadException 
    End Sub 
End Class 

Lorsque j'exécute le code dans Visual Studio le UnhandledException est appelé comme prévu, mais quand je exécuter l'application à partir de Windows, l'exception UndhanledThreadException est appelée à la place. ¿? ¿? ¿¿? ¿?

Quelqu'un a une idée de ce qui peut se passer ici?

Merci d'avance. EDIT: Après avoir lu Application.ThreadException documentation ressemble à Application.ThreadException est soulevée lorsque des exceptions se produisent à l'intérieur de "Windows Forms threads" (quels qu'ils soient, à mon humble avis, il n'y a qu'un seul thread Windows Form dans chaque application). Ainsi, Application.ThreadException est liée aux exceptions générées par le thread qui a créé le formulaire de votre application et les autres exceptions sont gérées par AppDomain.CurrentDomain.UnhandledException.

Répondre

2

Oui, c'est normal. Le receveur Application.ThreadException est désactivé lorsque vous exécutez sous un débogueur. Ceci est fait pour que vous puissiez facilement diagnostiquer les exceptions. Pour le faire se comporter de la même manière, vous devez appeler le Application.SetUnhandledExceptionMode() method. Malheureusement, c'est difficile à faire dans un projet VB.NET, vous devez désactiver le framework d'application. Ne vaut pas le tracas, appuyez sur Ctrl + F5 si vous voulez tester le code de gestion des exceptions.

+0

Pas de problème pour déboguer le code de gestion, c'est juste que je n'ai trouvé aucune documentation sur ce fait. Quoi qu'il en soit, juste essayé le SetUnHandledException et le gestionnaire n'est pas appelé quand même car l'exécution s'arrête au point d'origine Exception et ne peut pas aller plus loin. –

Questions connexes