2010-11-01 5 views
7

Estaba pensando, ¿es posible "anular" o quizás reemplazar las formas de seguridad estandard .net Formulario de excepción?Reemplazando la forma estándar de excepción/error en .net

Estoy hablando de este tipo:

alt text

¿Es posible, en el ámbito del programa de agujero, para anular esta ventana? Me refiero automáticamente, sin tener que realizar try/catch.

Gracias!

Daniel

Respuesta

0

En formularios web, puede manejar Application_Error en global.asax. Pero parece que estás hablando de formas de ganar. En ese caso:
intento de añadir el siguiente código en el método de arranque principal:

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ExceptionHandler.OnThreadException); 

y definir la clase ExceptionHandler de la siguiente manera:

/// <summary> 
/// Main thread error handler. 
/// </summary> 
public sealed class ExceptionHandler 
{ 
    private ExceptionHandler() 
    {} 

    /// <summary> 
    /// Handles an exception on the main thread. 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="t"></param> 
    public static void OnThreadException(object sender, ThreadExceptionEventArgs t) 
    { 
     DialogResult result = DialogResult.Cancel; 
     try 
     { 
      result = ShowThreadExceptionDialog(t.Exception); 
     } 
     catch 
     { 
      try 
      { 
       MessageBox.Show("Fatal Error", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); 
      } 
      finally 
      { 
       Application.Exit(); 
      } 
     } 

     // Exits the program when the user clicks Abort. 
     if (result == DialogResult.Abort) 
      Application.Exit(); 
    } 

    // Creates the error message and displays it. 
    private static DialogResult ShowThreadExceptionDialog(Exception e) 
    { 
     string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n"; 
     errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace; 
     return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop); 
    } 
} 

tomado de: http://www.eggheadcafe.com/community/aspnet/2/27469/any-method-for-handling-error-globally-in-c.aspx

2

Usted debe manejar ambos los siguientes eventos:

AppDomain.CurrentDomain.UnhandledException 
Application.ThreadException 

En esos controladores, podría mostrar un formulario personalizado que haya creado.

2

Esta es la clase ThreadExceptionDialog, se deriva de la clase Form. Derivar de él para alterar el diálogo es una causa perdida, no se puede acceder fácilmente a los controles integrados. Puedes crear tu propia clase derivada de Formulario para crear tu propio diálogo, solo dale un constructor que tome un argumento de Excepción. Implemente un controlador de eventos para Application.ThreadException para mostrarlo.

Observe la falla fundamental en el cuadro de diálogo. Espera que el usuario tome la decisión correcta cuando necesite hacer clic en un botón para cerrar el diálogo. Con, en general, información bastante oscura sobre qué salió mal exactamente. Significa algo para ti, rara vez nada más que 'oh mierda' para el usuario. Hacer clic en el botón Continuar no suele ser lo correcto.

Para evitar que el usuario tenga que hacer una elección tan difícil, llame a Application.SetUnhandledExceptionMode() en su método Main(), pasando ThrowException para que el evento nunca se levante. Cada excepción no controlada ahora pasa por AppDomain.UnhandledException. Incluyendo los que se generaron en un subproceso de trabajo, las excepciones que no incluyen producen el diálogo. Escriba un controlador de eventos para él y visualice y/o registre el valor de e.ExceptionObject.ToString(). Depende de usted resolver la forma de llevar esa información a su escritorio, o al personal de TI del usuario, para que pueda mejorar su producto y puedan estabilizar sus máquinas.

0

Compruebe this enlace.

Desde la página:

Introducción

Una de las cosas que me impresionó cuando empecé a aprender .NET fue su funcionalidad mejorada de control de excepciones. Con esto me refiero a características tales como el acceso fácil al tipo de excepción arrojada, el seguimiento completo de la pila y las excepciones internas. Esto hace que sea aún más fácil obtener información completa en aquellos lugares donde solo se detecta una excepción System.Exception de nivel superior. Encuentro esto conveniente ya que, si no necesita realizar una acción específica en un tipo particular de excepción, es tedioso tener controladores de captura sucesivos para cada tipo de excepción que pueda lanzarse. En cualquier caso, incluso si detecta excepciones específicas, generalmente también debe detectar System.Exception solo para cubrirse y evitar bloqueos del programa. Por lo tanto, descubro que termino capturando System.Exception por todo el lugar en mi código. Un escenario típico es que en las aplicaciones Windows Forms y ASP.NET Web Forms, todos mis manejadores de eventos no triviales terminan conteniendo los bloques Try. catch System.Exception.

El problema es que esto todavía complica el código un poco y realmente no parece del todo correcto. ¿Hay una mejor manera?

Cuestiones relacionadas