2009-11-05 7 views
7

¿Existe alguna manera (aparte de WerAddExcludedApplication que no funcionará en Windows XP) de deshabilitar la ventana "La aplicación ha encontrado un problema y debe cerrarse" para que no aparezca? cuando mi aplicación falla?Desactivar la ventana "Foo ha encontrado un problema y debe cerrarse"

alt text http://i37.tinypic.com/2vvw6yd.png

(imagen tomada de Bil Simser' blog)

necesito que esto funcione en Windows XP.

+10

Sí, evite que su aplicación falle. –

Respuesta

-4

No tiene excepciones no controladas.

+1

no puede manejar todas las excepciones ... al menos no siempre es posible –

+1

Sí, puede. Usted maneja todas las excepciones que pueda pensar y luego agrega un controlador para las excepciones no controladas para capturar las que no. Eso funciona aproximadamente el 99.9% del tiempo; para el otro 0.01%, arregla tu código malo. –

+2

¡No es una respuesta muy útil! –

1

Debe controlar los eventos Application.ThreadException y AppDomain.CurrentDomain.UnhandledException.

+0

Estos son eventos para que pueda actuar de acuerdo con ellos, en realidad no se maneja mucho, pero eso es más que un punto. Es posible que no tenga otra opción que cerrar la aplicación una vez que se corrompe y ¿qué hacer entonces? –

+0

Además, no funcionará de todos modos, incluso si se suscribe al evento, la ventana aparecerá de todos modos –

+0

Oh, definitivamente debe terminar la aplicación si llega a esta etapa, pero no veo un gran problema con la presentación un diálogo de bloqueo personalizado. En cuanto a su segundo comentario, todo lo que puedo decir es que funciona aquí. – Simon

2

Mi sugerencia es que, en lugar de deshabilitar este diálogo, se registre con Microsoft para que pueda ver los informes de errores que capturamos. De esta manera, puede usar este diálogo para usarlo, en lugar de intentar suprimirlo.

http://msdn.microsoft.com/en-us/isv/bb190483.aspx

+0

gracias, pero en este caso * realmente * no es una solución. Necesito específicamente lo que pregunto: la posibilidad de reiniciar la aplicación cuando se bloquea sin que aparezca ese cuadro de diálogo. –

7

Esto funcionará, lo que le permite mostrar su propio diálogo personalizado:

Application.ThreadException += new ThreadExceptionEventHandler(ThreadExceptionFunction); 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionFunction); 

Aquí está una muestra completa de MSDN:

Thread newThread = null; 

// Starts the application. 
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)] 
public static void Main(string[] args) 
{ 
    // 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); 

    // Runs the application. 
    Application.Run(new ErrorHandlerForm()); 
} 

// Programs the button to throw an exception when clicked. 
private void button1_Click(object sender, System.EventArgs e) 
{ 
    throw new ArgumentException("The parameter was invalid"); 
} 

// Start a new thread, separate from Windows Forms, that will throw an exception. 
private void button2_Click(object sender, System.EventArgs e) 
{ 
    ThreadStart newThreadStart = new ThreadStart(newThread_Execute); 
    newThread = new Thread(newThreadStart); 
    newThread.Start(); 
} 

// The thread we start up to demonstrate non-UI exception handling. 
void newThread_Execute() 
{ 
    throw new Exception("The method or operation is not implemented."); 
} 

// Handle the UI exceptions by showing a dialog box, and asking the user whether 
// or not they wish to abort execution. 
private static void Form1_UIThreadException(object sender, ThreadExceptionEventArgs t) 
{ 
    DialogResult result = DialogResult.Cancel; 
    try 
    { 
     result = ShowThreadExceptionDialog("Windows Forms Error", t.Exception); 
    } 
    catch 
    { 
     try 
     { 
      MessageBox.Show("Fatal Windows Forms Error", 
       "Fatal Windows Forms Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop); 
     } 
     finally 
     { 
      Application.Exit(); 
     } 
    } 

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

// Handle the UI exceptions by showing a dialog box, and asking the user whether 
// or not they wish to abort execution. 
// NOTE: This exception cannot be kept from terminating the application - it can only 
// log the event, and inform the user about it. 
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    try 
    { 
     Exception ex = (Exception)e.ExceptionObject; 
     string errorMsg = "An application error occurred. Please contact the adminstrator " + 
      "with the following information:\n\n"; 

     // Since we can't prevent the app from terminating, log this to the event log. 
     if (!EventLog.SourceExists("ThreadException")) 
     { 
      EventLog.CreateEventSource("ThreadException", "Application"); 
     } 

     // Create an EventLog instance and assign its source. 
     EventLog myLog = new EventLog(); 
     myLog.Source = "ThreadException"; 
     myLog.WriteEntry(errorMsg + ex.Message + "\n\nStack Trace:\n" + ex.StackTrace); 
    } 
    catch (Exception exc) 
    { 
     try 
     { 
      MessageBox.Show("Fatal Non-UI Error", 
       "Fatal Non-UI Error. Could not write the error to the event log. Reason: " 
       + exc.Message, MessageBoxButtons.OK, MessageBoxIcon.Stop); 
     } 
     finally 
     { 
      Application.Exit(); 
     } 
    } 
} 

// Creates the error message and displays it. 
private static DialogResult ShowThreadExceptionDialog(string title, Exception e) 
{ 
    string errorMsg = "An application 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, title, MessageBoxButtons.AbortRetryIgnore, 
     MessageBoxIcon.Stop); 
} 
+0

¿Y qué sucede si no estoy en una aplicación de WinForms? pero di ... Aplicación de consola, ¿dónde no uso la clase de aplicación? –

1

No es una solución de programación, pero puede hacerlo editando la configuración de informes de errores de Windows.

  1. Open Control Panel
  2. Sistema abierto, de diálogo Propiedades del sistema se abrirá
  3. Ir a la ficha Opciones avanzadas
  4. Haga clic en Informe de errores, de diálogo Informe de errores se abrirá
  5. Si desea desactivarlo en una sola aplicación, haga clic en el botón Seleccionar programas, se abrirá un cuadro de diálogo
  6. Haga clic en el (segundo) botón Agregar para agregar su aplicación a la lista "No denunciar errores para estos programas".
  7. Confirme los tres cuadros de diálogo ...
Cuestiones relacionadas