处理AppDomain.CurrentDomain.UnhandledException时,是不是可以显示表单? [英] Is it impossible to show forms when handling a AppDomain.CurrentDomain.UnhandledException?

查看:165
本文介绍了处理AppDomain.CurrentDomain.UnhandledException时,是不是可以显示表单?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

只是一个快速的问题。

我可以得到一个表单与其他异常一起显示,但是我正在问的类型,我得到系统应用程序不再工作对话框:

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:

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:

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


推荐答案

也许这篇文章将会有所帮助在WinForms中捕获未处理的异常的简单类

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

编辑:
我检查自己:

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?

另外从文章:

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

这篇关于处理AppDomain.CurrentDomain.UnhandledException时,是不是可以显示表单?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆