开发者

Is it impossible to show forms when handling a AppDomain.CurrentDomain.UnhandledException?

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


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...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜