Captura de excepciones no controladas en .Net 2.0. evento mal llamada
-
26-09-2019 - |
Pregunta
Estoy investigando un poco sobre cómo las excepciones no controladas se gestionan en .Net y estoy obteniendo resultados inesperados que me gustaría compartir con usted para ver qué piensa usted acerca de.
El primero de ellos es bastante simple para ver. Escribí este código para hacer la prueba, sólo un botón que inicia una excepción en el mismo subproceso que creó el formulario:
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
Cuando ejecuto el código dentro del Visual Studio el UnhandledException se llama como se esperaba, pero cuando ejecuto la aplicación de Windows, el UndhanledThreadException se llama en su lugar. ¿? ¿? ¿¿? ¿?
Alguien tiene alguna idea de lo que puede estar sucediendo aquí?
Gracias de antemano.
EDIT: Después de leer miradas documentación Application.ThreadException como Application.ThreadException se eleva cuando ocurren excepciones dentro de las discusiones 'Formularios de Windows' (sean las que sean, en mi humilde opinión sólo hay un formulario de Windows hilo en cada aplicación). Así Application.ThreadException está relacionado con excepciones que devuelve el subproceso que creó la forma de su aplicación y las demás excepciones son manejados por el AppDomain.CurrentDomain.UnhandledException.
Solución
Sí, esto es normal. El receptor Application.ThreadException se desactiva cuando se ejecuta bajo un depurador. Esto se hace para que pueda diagnosticar fácilmente excepciones. Para hacer que se comporte de la misma manera, hay que llamar a la Application.SetUnhandledExceptionMode () método . Por desgracia, eso es difícil de hacer en un proyecto VB.NET, usted tiene que desactivar el marco de la aplicación.
No vale la pena la molestia, pulse Ctrl + F5 si quieres probar el código de control de excepciones.