2011-06-09 39 views

Respuesta

35

En aplicaciones de Windows Forms, cuando se produce una excepción en cualquier lugar de la aplicación (en el hilo principal o durante las llamadas asincrónicas), puede cogerlo mediante el registro para el evento ThreadException en el Solicitud. De esta forma, puede tratar todas las excepciones de la misma manera.

Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod) 

private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t) 
{ 
    //Exception handling... 
} 
+3

Solo en caso de que pueda ayudar a alguien. Asegúrese de registrarse en el controlador de eventos (Application.ThreadException + = ...) antes de ejecutar la aplicación (Application.Run (...);). De lo contrario, no funcionará (como me sucedió a mí) –

+0

Responde la pregunta, pero el enlace que Brian Dishaw tiene en su respuesta es muy completo y tiene todos (si no la mayoría) casos de uso cubiertos.Lo único que no es útil en una aplicación de producción sería el método de devolver un cuadro de diálogo con el mensaje de error. Una aplicación de producción real se enviaría al Registro de eventos, en lugar de tener un cuadro de diálogo emergente en su aplicación. – MacGyver

15

La respuesta obvia es poner un manejador de excepciones en la parte superior de su cadena de ejecución.

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    try 
    { 
     Application.Run(new YourTopLevelForm()); 
    } 
    catch 
    { 
     //Some last resort handler unware of the context of the actual exception 
    } 
} 

Esto cogerá cualquier excepción que se produce en el hilo principal de la GUI. Si también desea capturar globalmente las excepciones que ocurren en todos los hilos, puede suscribirse al evento AppDomain.UnhandledException y manejar allí.

Application.ThreadException += 
    new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod) 
private static void MyCommonExceptionHandlingMethod(
               object sender, 
               ThreadExceptionEventArgs t) 
{ 
    //Exception handling... 
} 

Código copiado de Charith J's answer

Ahora en el consejo ...

Estas opciones sólo se debe utilizar como último recurso, por ejemplo, si desea suprimir excepciones no capturadas accidentalmente de la presentación al usuario. Debería estar atrapando antes siempre que sea posible, cuando sepa algo sobre el contexto de la excepción. Aún mejor, es posible que puedas hacer algo sobre el problema.

El manejo de excepciones estructurado puede parecer una sobrecarga innecesaria que puede solucionar con un catch all, pero existe porque este no es el caso. Además, este trabajo debe hacerse a medida que se escribe el código, cuando el desarrollador tiene la lógica fresca en su mente. No seas flojo y deja este trabajo para más adelante o para que un desarrollador más profesional lo elija.

Disculpas si ya sabes y haces esto.

+3

@Downvoter, cualquier crítica recibida con gratitud, estoy aquí para aprender. – Jodrell

+0

Esto me parece bien. No veo ninguna razón para votar hacia abajo ... – CharithJ

4

Ver AppDomain.UnhandledException y Application.ThreadException.

21

Creo que esto es lo más parecido posible a lo que está buscando dentro de una aplicación de formulario de victoria.

http://msdn.microsoft.com/en-us/library/ms157905.aspx

// Add the event handler for handling UI thread exceptions to the event. 
Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException); 

// Set the unhandled exception mode to force all Windows Forms errors to go through 
// our handler. 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

// Add the event handler for handling non-UI thread exceptions to the event. 
AppDomain.CurrentDomain.UnhandledException += 
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

Sin hacer todos estos pasos se corre el riesgo de tener algunas excepciones obtener no controlada.

+0

Este es mi ciclo principal (mi aplicación comienza oculta, con un ícono de barra de estado). Con su código, todavía tengo que ajustar 'nuevo Form1(); Application.Run();' dentro de un try/catch ... – doekman

Cuestiones relacionadas