Hasta ahora, acabo de poner un bloque try/catch en torno a la Application.Run en el Program.cs punto de entrada al programa. Este capturas de todas las excepciones bastante bien en modo de Depuración, pero cuando voy a ejecutar el programa sin el modo de depuración, las excepciones no son manejados más. Tengo la excepción no controlada en el cuadro.

Yo no quiero que esto suceda. Quiero que todas las excepciones a ser capturado cuando se ejecuta en modo de depuración no. El programa cuenta con múltiples hilos y preferiblemente todas las excepciones de ellos quedar atrapados por el mismo controlador; quiero registro de excepciones en la DB. ¿Alguien tiene algún consejo de cómo hacer esto?

4 Comentarios

  1. 102

    Echa un vistazo al ejemplo de la ThreadException documentación:

    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);
    }

    También puede ser que desee para no coger excepciones cuando la depuración, ya que esto hace que sea más fácil de depurar. Es algo de un hack, pero para que usted puede ajustar el código de arriba de todo con

     if (!AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe")) { ... }

    Para prevenir el contagio de las excepciones cuando la depuración.

    • Hice un trabajo en segundo plano, y en el dowork controlador de eventos me intentially causado una excepción de referencia nula. Sin embargo, no quedar atrapados por el dominio de aplicación.CurrentDomain.UnhandledException a pesar de estos: de la Aplicación.ThreadException += new System.Las operaciones de roscado.ThreadExceptionEventHandler(Application_ThreadException); La Aplicación.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); Dominio De Aplicación.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    • fondo de trabajadores de las capturas de las excepciones a sí mismo. Usted puede comprobar la excepción en el RunWorkerCompleted incluso, mirando a la RunCompletedEventArgs.Error de la propiedad.
    • Usted puede probar el manejo de excepciones para subprocesos adicionales por poner esto en el OnLoad de su formulario principal. nuevo Hilo(() => { throw new Exception(); }).Start();
    • Desafortunadamente el manejo de UnhandledException no va a dejar de aplicación de la terminación 🙁
    • Esto impide la aplicación de la terminación de stackoverflow.com/a/15348805/501082
    • En lugar de la FriendlyName.EndsWith hack, intente Depurador.IsAttached que es más limpio.
    • En mi humilde opinión, añadir notas en su respuesta, Debugger.IsAttached para evitar la captura de excepciones cuando la depuración y el manejo de UnhandledException no va a dejar de aplicación de la terminación de ( referencia por @NazarGrynko)
    • ¿Puedo combinar AppDomain.CurrentDomain.UnhandledException and Application.ThreadException con [HandleProcessCorruptedStateExceptions] etiqueta ? stackoverflow.com/a/5763158/206730 CLR Interior de Manejo del Estado Dañado Excepciones ciertas excepciones que son ya no es atrapado por defecto; estos tienden a ser las excepciones que se indican (posiblemente fatal) estado dañado el archivo ejecutable, como un AccessViolationException.
    • En fin para no coger excepciones durante la depuración, puede comprobar el Sistema.Los diagnósticos.Depurador.IsAttached valor de la propiedad. Es más elegante que la comprobación de la ejecución de nombre de archivo ejecutable.

  2. 27

    NETO 4, hay ciertas excepciones que son ya no capturados por defecto; estos tienden a ser las excepciones que se indican (posiblemente fatal) estado dañado el archivo ejecutable, como un AccessViolationException.

    Trate de usar el [HandleProcessCorruptedStateExceptions] de la etiqueta en la parte frontal de su método principal, por ejemplo,

    using System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions
    
    [HandleProcessCorruptedStateExceptions]
    public static int Main()
    {
        try
        {
            //Catch any exceptions leaking out of the program
            CallMainProgramLoop();
        }
        catch (Exception e) //We could be catching anything here
        {
            System.Console.WriteLine(e.Message);
            return 1;
        }
        return 0;
      } 
    • Puedo usar AppDomain.CurrentDomain.UnhandledException y Application.ThreadException demasiado con [HandleProcessCorruptedStateExceptions] etiqueta ?
  3. 17

    Un buen ejemplo se puede encontrar en la http://www.csharp-examples.net/catching-unhandled-exceptions/
    Básicamente, el cambio de su principal para:

    static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
            Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    
            Application.Run(new Form1());
        }
    
        static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
        }
    
        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
        }
  4. 8

    Puede utilizar NBug de la biblioteca para que. Con un mínimo de configuración como esta:

    NBug.Settings.Destination1 = "Type=Mail;[email protected];[email protected];SmtpServer=smtp.mycompany.com;";
    AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException;
    Application.ThreadException += NBug.Handler.ThreadException;

    Usted puede comenzar a recopilar información sobre todos los no controlada errores en su aplicación, incluso cuando se desplegó a los clientes. Si usted no desea utilizar una 3ra parte de la biblioteca, deberá adjuntar a la siguiente eventos:

    //These two should come before enabling visual styles or running the application
    AppDomain.CurrentDomain.UnhandledException += ...
    Application.ThreadException += ...
    ...
    Application.Run(new Form1());
    • Eres bienvenido. El uso de la NBug proyecto de foro de discusión si usted tiene más preguntas (nbusy.com/forum/f11) o utilice el [nbug] de la etiqueta aquí.
    • Por supuesto, también puede suscribirse a «regular» controlador de eventos para el evento UnhandledException. Consulte msdn.microsoft.com/en-us/library/…
    • Chicos en Win7 + VS10, si me suscribo a estos eventos de la suscripción no se ejecuta, en lugar de la normal de Windows Vista/7 cuadro de diálogo se muestra Check Online for a Solution O Close the Program.. etc. Pero si yo NO comparto, me sale el genérico ordinario .RED de Excepción no Controlada en la Ventana. Esto sucede en Ambos Liberación y las versiones de Depuración, también trató de establecer Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); no cambia nada.
    • después de la manipulación de las excepciones que se debe salir de la aplicación con el medio Ambiente.Exit(1); si usted no desea que la ventana de error de muestra.
    • gracias por su respuesta. Quiero mi propio error de formulario para mostrar y, a continuación, quiero que la app para salir. Pero el evento de suscripción nunca se ejecuta, muestra el genérico Win Vista/7 de diálogo cuando se encuentra con excepciones. Pero si yo no suscribirse el genérico .RED de excepción no controlada aparece el cuadro de diálogo!
    • Intentar conectar a todos los posibles excepción no controlada eventos: UnhandledException, ThreadException (WinForms), DispatcherUnhandledException (WPF), UnobservedTaskException (Roscado.Las tareas). Es posible que te has perdido uno de estos excepción no controlada fuentes.
    • Estoy en winforms, y suscrito a ambos no Controlada y el Hilo de Excepción.
    • Intente algo como esto: Application.ThreadException += (sender, e) => { new MyErrorForm(); Environment.Exit(0); }; nota que he cambiado de medio Ambiente.Exit(1); el medio Ambiente.Exit(0); lo cual debe evitar que Vista/7 cuadro de diálogo.
    • GitHub es la nueva fuente de repos. Enviar tire de pedidos: github.com/soygul/NBug
    • No sé la buenos patrones y prácticas. tenga cuidado cuando use el dominio de aplicación.Evento UnhandledException Revision note: me fue indicado por Phillip Haack de esta importante omisión. Other common source of mistakes is the Application.ThreadException event. There are lots of caveats when using them,

Dejar respuesta

Please enter your comment!
Please enter your name here