Estoy trabajando en un proyecto bastante grande, y es poco probable que atrape todo. He encontrado el evento que me notifica las excepciones no controladas, sin embargo, no he encontrado la forma de cerrar programáticamente el cuadro de diálogo de error de Windows. Idealmente, si hay una excepción no controlada, me gustaría que se desencadene ese evento, proporcionar un cuadro de diálogo que indique al usuario que hay un problema y luego cerrar con gracia. ¿Hay alguna manera de hacer esto? Me di cuenta de que podía envolver la capa más alta en una captura de prueba, pero esperaba algo un poco más elegante.Prevenir "Enviar informe de errores a Microsoft"
Respuesta
Esto es lo que hicimos.
static void Main() {
try
{
SubMain();
}
catch (Exception e)
{
HandleUnhandledException(e);
}
}
private static void SubMain()
{
// Setup unhandled exception handlers
AppDomain.CurrentDomain.UnhandledException += // CLR
new UnhandledExceptionEventHandler(OnUnhandledException);
Application.ThreadException += // Windows Forms
new System.Threading.ThreadExceptionEventHandler(
OnGuiUnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
// CLR unhandled exception
private static void OnUnhandledException(Object sender,
UnhandledExceptionEventArgs e)
{
HandleUnhandledException(e.ExceptionObject);
}
// Windows Forms unhandled exception
private static void OnGuiUnhandledException(Object sender,
System.Threading.ThreadExceptionEventArgs e)
{
HandleUnhandledException(e.Exception);
}
http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx
Aunque si usted está liberando esto como un proyecto comercial, le animo a registrarse con Microsoft, por lo que en realidad se puede obtener los volcados y info error informando de que se está enviando a MS
Has respondido a tu pregunta. La mejor forma de evitar el diálogo de error es escribir código que maneje sus excepciones para que el cuadro de diálogo nunca aparezca. Apostaría a que esto es lo que Raymond Chen sugeriría (si puedo ser tan audaz).
Un try/catch global (como la primera respuesta) es lo que estaba considerando. Simplemente no estaba seguro de si eso era una buena práctica o no. Tampoco estaba seguro de si había una forma más limpia de hacerlo. – Steve
Puede intentar jugando con HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug
que la punta es de forma Drwatson días .. Puede o no puede trabajar.
No ensucie con la configuración de todo el sistema si está tratando de resolver un problema específico de la aplicación –
- Puede que a los usuarios no les guste el hecho de que cambie su configuración ... - Su aplicación puede no tener acceso de escritura a este registro llave. –
Si su pregunta fue con respecto a una aplicación de WinForms, entonces la respuesta seleccionada funcionará para usted, sin embargo, no es exactamente elegante.
.NET proporciona un asistente para este escenario exacto:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException
Si está utilizando .NET Framework 2.0 o posterior y no hay una excepción no controlada desde un subproceso de trabajo, lo que belive Está fuera de suerte. En .NET 1.0 y 1.1, CLR simplemente se tragó la excepción de un hilo que no sea el hilo principal. Sin embargo, esto se modificó en .NET 2.0, donde una excepción no controlada en un hilo provoca el cierre de la aplicación.
Puede suscribirse a AppDomain.CurrentDomain.UnhandledException para recibir notificaciones cuando ocurran este tipo de excepciones no controladas, pero la aplicación probablemente se cierre en este punto y se le dé la oportunidad de hacer cosas antes del inevitable registro como la excepción en algún lugar y muestra un mensaje fácil de usar. UnhandledExceptionEventArgs tiene una propiedad de solo lectura llamada IsTerminating que puede inspeccionar para ver si la aplicación está terminando o no. Una vez que la aplicación finaliza, generalmente aparece el cuadro de diálogo de informe de error de Microsoft.
Si bien no lo recomendaría, hay una forma de volver al comportamiento de CLR 1.0 y 1.1 estableciendo el indicador de compatibilidad de aplicaciones en el archivo de configuración de la aplicación.
Esto no debería causar la aplicación para terminar en los casos de excepciones no controladas y reducir la probabilidad de conseguir que el diálogo de informe de errores.
Mi recomendación sería atrapar solo las excepciones que anticipa y puede manejar en su código y dejar que las otras aparezcan.
Depende de cómo administre sus hilos de trabajo. Mi enfoque preferido para todos los trabajos que no son de larga duración es usar Delegate.BeginInvoke() para usar un hilo de ThreadPool para realizar la acción asincrónica. Si haces esto, el hilo devolverá cualquier excepción cuando invoques a EndInvoke(); solo tienes que asegurarte de que se invoque EndInvoke para cada BeginInvoke (no hacerlo puede dar lugar a fugas de recursos). – STW
- 1. .NET "Enviar informe de error a [me]"
- 2. ¿Se puede evitar el informe de errores de Microsoft para una sola aplicación?
- 3. Errores ortográficos en Microsoft Word
- 4. Mejorando nuestro informe de errores de javascript
- 5. Prevenir errores de codificación en Python
- 6. Microsoft ReportViewer: errores caducados de sesión
- 7. Prevenir php session_start() para enviar una cookie
- 8. Enviar un informe directamente a la impresora con Reporting Services
- 9. ¿Cómo enviar un informe de error al equipo de producto Sharepoint 2010?
- 10. Un tutorial para el informe de Microsoft en aplicaciones WinForm
- 11. Obfuscator Opción "Prevenir que Microsoft Desensamblador IL abra mi ensamblaje"
- 12. ¿Cómo enviar para Microsoft Knowledge Base?
- 13. Sistemas automáticos de informe de errores de Java
- 14. Confundir errores de compilación de Clojure: ¿mal informe de línea?
- 15. Uso de strftime en nil object - cómo prevenir errores?
- 16. Crystal Reports "Load Error del Informe" informe de errores que se ejecuta en el servidor
- 17. Rehabilitación Enviar después de prevenir el valor predeterminado
- 18. ¿Puedo suprimir un informe de trabajo LSF sin enviar correo?
- 19. informe de estado Tomcat
- 20. Informe de bloqueo simple?
- 21. ¿Cómo prevenir insertos múltiples al enviar un formulario en PHP?
- 22. Valgrind informe
- 23. Errores en la propiedad OrderByOn en Microsoft Access 2010
- 24. actualización Prevenir a filas inexistentes
- 25. Cómo suprimir el cuadro de diálogo Informe de error de Microsoft cuando un proceso secundario se bloquea
- 26. Servidor SQL: informe de error a .NET
- 27. Informe de prueba
- 28. Enviar salida ELMAH a través de NLog
- 29. informe de errores de php Offset de cadena sin inicializar: 0
- 30. Microsoft Word a Org-mode
¿Por qué me dieron downvoted? –
¿Por qué implementa AppDomain.UnhandledException * y * envuelve todo en un bloque Try/Catch? Eso es tonto. –