2009-09-14 22 views
28

Tengo una aplicación de consola escrita en C# /. NET que quiero ejecutar desde un script (nant). Si ocurre una excepción en la aplicación de la consola, me gustaría continuar, pero en Windows Vista hay una ventana emergente que busca soluciones y pide depuración, etc.Evite el "programa parado de trabajar" en C# /. NET

Me gustaría evitar la ventana emergente con el "programa parado" "cuando ocurre una excepción en la aplicación de la consola. ¿Cómo puedo controlar esto desde C# /. NET?

(Una pregunta similar se dirige the issue for the C language, pero me gustaría una solución para C#/.NET..)

(Para aclarar: Me gustaría que la excepción que se pasa a Nant, pero sin la ventana emergente.)

Respuesta

40

La ventana emergente del depurador JIT se produce cuando hay una excepción no controlada. Es decir, una excepción recorre todo el camino hasta la raíz de cualquier hilo en el tiempo de ejecución.

Para evitar esto, puede manejar el evento AppDomain.CurrentDomain.UnhandledException y simplemente llame al Environment.Exit(1) para salir con elegancia.

Esto manejará todas las excepciones en todos los hilos dentro de su AppDomain. A menos que estés haciendo nada especial, su aplicación probablemente sólo tiene un dominio de aplicación, por lo que poner esto en su método de public static void Main debería ser suficiente:

AppDomain.CurrentDomain.UnhandledException += (sender, args) => 
{ 
    Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject); 
    Environment.Exit(1); 
}; 

probablemente debería utilizar el registrador de NAnt para escribir el error en este caso (no obstante, no puede recordar la API para este manual).

También puede disable JIT debugging en la máquina. Solo recomendaría esto en ciertas circunstancias, como para un servidor de compilación dedicado.

+1

Debería preguntar si está en modo de lanzamiento antes, después de esto se eliminará la depuración – Andreas

+0

¿Por qué 'args.ExceptionObject' no es una' Excepción'? ¿Es seguro lanzar? – Winter

+0

@Winter buena pregunta. Yo usaría un molde 'as' y verificaría' null' por mi cuenta. –

1

Simplemente tome la excepción y regístrela/ignórela.

+0

Sí, que evita la ventana emergente, sino que evita la ventaja de tener otros programas que llaman a este programa saben que ocurrió alguna excepción. Ver la respuesta aceptada. –

+0

Puede llamar a Environment.Exit en catch block. – maciejkow

0

Normalmente, esto solo ocurre cuando su aplicación no maneja una excepción. Si envuelve la aplicación de la consola completa en un try/catch bblock, y solo devuelve un código de falla, entonces evitará esto.

1

La ventana emergente aparece debido a una excepción no controlada. Para evitar eso, asegúrese de que su método principal capture todas las excepciones y las convierta en otra información útil que pueda recoger. Ignorar la excepción no es recomendable.

Por cierto, recuerde que las excepciones son por subproceso, por lo que si su aplicación genera subprocesos o utiliza subprocesos de grupo de subprocesos, necesita un controlador para estos también.

1

En Windows Vista, puede deshabilitar este cuadro de diálogo para sus programas.

Desactive la función "Informes de problemas y soluciones". Lo encuentras en el Panel de control -> Informes de problemas y soluciones -> Cambiar Configuración -> Configuración avanzada -> Desactivar para mis programas, informes de problemas

+0

Sí, eso podría funcionar si lo configuro en mi propia máquina, pero me gustaría que se horneara en el programa de manera que también funcione de manera consistente en otras máquinas. (Ver respuesta aceptada). –

+1

¿Puedo hacer esto en Windows 10? – zsf222