views:

32

answers:

2

Just a quick question.

I can get a form to show with other exceptions, but with the type I'm asking about, I get the system "application is no longer working" dialog:

Program.cs:

        #if !DEBUG
        // Add the event handler for handling UI thread exceptions to the event.
        Application.ThreadException += new ThreadExceptionEventHandler(Logging.Application_ThreadException);

        // 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(Logging.CurrentDomain_UnhandledException);
        #endif

        throw new Exception();

Logging.cs:

    public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        ExceptionHandler((Exception)e.ExceptionObject, true);
    }

    private static void ExceptionHandler(Exception e, bool isFatal)
    {
        LogException(e, isFatal);

        //if (!isFatal)
        //{
            FormException formException = new FormException(isFatal);
            formException.Show();
        //}
        //else // It seems that showing a form when you have an unhandled exception isn't a good idea...
        //{
        //    MessageBox.Show("Crashed",
        //        Program.Name,
        //        MessageBoxButtons.OK,
        //        MessageBoxIcon.Stop);
        //    Program.Exit();
        //}
    }
+1  A: 

Maybe this article will be helpful A Simple Class to Catch Unhandled Exceptions in WinForms

EDIT: I check myself:

    static void Main()
    {
        AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
                                                          {
                                                              using (var form = new Form1())
                                                              {
                                                                  form.ShowDialog();
                                                              }
                                                          };

        throw new Exception();
    }

Worked as expected. So can you show your code which doesn't work?


Also from article:

   public UnhandledExceptionDlg()
    {
        // Add the event handler for handling UI thread exceptions to the event:
        Application.ThreadException += new ThreadExceptionEventHandler(ThreadExceptionFunction);

        // 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(UnhandledExceptionFunction);
    }


    private void UnhandledExceptionFunction(Object sender, UnhandledExceptionEventArgs args)
    {
        // Suppress the Dialog in Debug mode:
        #if !DEBUG
        ShowUnhandledExceptionDlg((Exception)args.ExceptionObject);
        #endif
    }

    private void ShowUnhandledExceptionDlg(Exception e)
    {
        Exception unhandledException = e;

        if(unhandledException == null)
            unhandledException = new Exception("Unknown unhandled Exception was occurred!");

        UnhandledExDlgForm exDlgForm = new UnhandledExDlgForm();
        try
        {
            string appName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
            exDlgForm.Text = appName;
            exDlgForm.labelTitle.Text = String.Format(exDlgForm.labelTitle.Text, appName);
            exDlgForm.checkBoxRestart.Text = String.Format(exDlgForm.checkBoxRestart.Text, appName);
            exDlgForm.checkBoxRestart.Checked = this.RestartApp;

            // Do not show link label if OnShowErrorReport is not handled
            exDlgForm.labelLinkTitle.Visible = (OnShowErrorReport != null);
            exDlgForm.linkLabelData.Visible = (OnShowErrorReport != null);

            // Disable the Button if OnSendExceptionClick event is not handled
            exDlgForm.buttonSend.Enabled = (OnSendExceptionClick != null);

            // Attach reflection to checkbox checked status
            exDlgForm.checkBoxRestart.CheckedChanged += delegate(object o, EventArgs ev)
            {
                this._dorestart = exDlgForm.checkBoxRestart.Checked;
            };

            // Handle clicks on report link label
            exDlgForm.linkLabelData.LinkClicked += delegate(object o, LinkLabelLinkClickedEventArgs ev)
            {
                if(OnShowErrorReport != null)
                {
                    SendExceptionClickEventArgs ar = new SendExceptionClickEventArgs(true, unhandledException, _dorestart);
                    OnShowErrorReport(this, ar);
                }
            };

            // Show the Dialog box:
            bool sendDetails = (exDlgForm.ShowDialog() == System.Windows.Forms.DialogResult.Yes);

            if(OnSendExceptionClick != null)
            {
                SendExceptionClickEventArgs ar = new SendExceptionClickEventArgs(sendDetails, unhandledException, _dorestart);
                OnSendExceptionClick(this, ar);
            }
        }
        finally
        {
            exDlgForm.Dispose();
        }
    }

So it shows form too...

Nick Martyshchenko
The example provided uses a MessageBox.
a2h
Check its source...
Nick Martyshchenko
I stand corrected. But running the solution has either crashing or unhandled exceptions being caught by VC#
a2h
A: 

Nick Martyshchenko's answer got me to try and use ShowDialog() instead of Show(), and that seemed to do the trick.

Strange stuff, would love to know why.

a2h
`ShowDialog()` "blocks" execution until return from form, `Show()` continues execution. So when you use `Show()` you just continue to fail exit from app without delay.
Nick Martyshchenko
Comment, not an answer.
Austin Salonen
Nick's answer doesn't directly answer the question per se? Your 7k reputation is attempting to tell me otherwise so I'll play along.
a2h