Evite "el programa dejó de funcionar" en C#/.NET
exception windows-vista (5)
Tengo una aplicación de consola escrita en C # / .NET que deseo ejecutar desde un script (nant). Si ocurre una excepción en la aplicación de la consola, me gustaría que nant continúe, pero en Windows Vista hay una ventana emergente que busca soluciones y solicita la depuración, etc.
Me gustaría evitar la ventana emergente con "el programa dejó de funcionar" cuando ocurre una excepción en la aplicación de la consola. ¿Cómo puedo controlar esto desde C # / .NET?
(Una pregunta similar aborda el problema para el lenguaje C , pero me gustaría una solución para C # / .NET).
(Para aclarar: me gustaría que la excepción se pase a nant, pero sin la ventana emergente).
Bajo Windows Vista puede deshabilitar este diálogo para sus programas.
Deshabilite la "característica Informes de problemas y soluciones". Lo encontrará en Panel de control -> Informes de problemas y soluciones -> Cambiar configuración -> Configuración avanzada -> Desactivar para mis programas, informe de problemas
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 conviértalos en otra información útil que pueda recoger. No se recomienda simplemente ignorar la excepción.
Por cierto, recuerde que las excepciones son por subproceso, por lo que si su aplicación genera subprocesos o utiliza subprocesos de subprocesos, también necesita un controlador para estos.
La ventana emergente del depurador JIT se produce cuando hay una excepción no controlada. Es decir, una excepción hace un túnel hasta la raíz de cualquier subproceso en el tiempo de ejecución.
Para evitar esto, puede manejar el evento AppDomain.CurrentDomain.UnhandledException
y simplemente llamar a Environment.Exit(1)
para salir con gracia.
Esto manejará todas las excepciones en todos los hilos dentro de su dominio de aplicación. A menos que esté haciendo algo especial, su aplicación probablemente solo tenga un dominio de aplicación, por lo que debería ser suficiente poner este método en su public static void Main
.
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject);
Environment.Exit(1);
};
Probablemente debería usar el registrador NAnt para escribir también el error en este caso (aunque no puedo recuperar la API de esta manera inmediata).
También puede deshabilitar la depuración JIT en la máquina. Solo recomendaría esto en ciertas circunstancias, como para un servidor de compilación dedicado.
Por lo general, esto solo ocurre cuando su aplicación no maneja una excepción. Si envuelve toda la aplicación de la consola en un bblock try / catch, y simplemente devuelve un código de falla, evitará esto.
Solo captura la excepción y conéctate / ignórala.