martes, 13 de enero de 2009

Gestión global de excepciones

Software bug 04

Aunque cada vez el software que desarrollamos es más robusto la verdad es que nadie se escapa de dejar algún gazapo que en cualquier momento se le presentará al usuario final en forma de un horrible mensaje de error.

Si queremos evitar estas situaciones podemos definir los eventos UnhandledException y ThreadException en nuestros programa y problema resuelto. La verdad es que no parece demasiado lógico que tengamos que definir dos eventos para capturar las excepciones que no controlamos pero el primero se encarga de manejar las que no tienen que ver con el interface gráfico y el segundo se encarga de las visuales.

La implementación sería de la siguiente manera:

  1. Definición de los eventos:
    Private Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load

    Dim currentDomain As AppDomain = AppDomain.CurrentDomain
    AddHandler currentDomain.UnhandledException, AddressOf AppDomain_UnhandledException
    AddHandler Application.ThreadException, AddressOf Application_ThreadException

    End Sub


  2. Declaración del evento que maneja la UnhandledException:

    Private Sub AppDomain_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)

    Dim st As New StackTrace()
    Dim pila As String = st.ToString() 'Obtenemos el estado actual de la pila

    Dim ex As Exception = DirectCast(e.ExceptionObject, Exception)

    'Acciones a realizar para registrar las excepciones
    MessageBox.Show("UnhandledException" & ex.Message)

    End Sub


  3. Declaración del evento que maneja la ThreadException:

    Private Sub Application_ThreadException(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs)

    Dim st As New StackTrace()
    Dim pila As String = st.ToString()

    'Acciones a realizar para registrar las excepciones
    MessageBox.Show("ThreadException" & e.Exception.Message & ". " & pila)

    End Sub


¡Y eso es todo! Ahora ya no hay excusa para no facilitarle el trabajo al usuario final mostrándole esos feos mensajes de error y además nos permitirá registrar toda la información existente en el sistema en el momento que se lanzó la excepción.

No hay comentarios:

Publicar un comentario