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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top