替换Windows窗体中的默认未处理错误对话框

时间:2012-06-01 14:55:35

标签: c# winforms error-handling

目前,当我的Windows窗体程序中的某个窗体中出现未处理的错误时,会弹出一个对话框,其中包含许多与最终用户无关且令人困惑的详细信息。

我希望在我的某个表单中出现未处理的错误时,使用更加用户友好的对话框替换该对话框(并使用Tabbed界面隐藏但提供技术详细信息)。

有没有办法用自定义对话框替换此默认对话框?

我的应用程序是MDI,因此如果表单中出现错误,我想关闭该表单,以友好的方式显示错误并允许它们与应用程序中的其他窗口一起使用(除非它一个严重错误)。

1 个答案:

答案 0 :(得分:2)

有几种方式让人想起。最简单的方法是通过监听Application.ThreadException事件

来捕获所有未处理的异常
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);           
        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        Application.Run(new Form1());
    }

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.Message);
    }

然而,这只会停止崩溃并且不会关闭mdi表单。如果你停止发送线程,它将完全停止mdi表单(在mdi之外更容易,然后表单可以在单独的线程中运行,可以启动沙盒)。

我通常做的是运行沙盒所有代码。通常封装在一个动作对象中,但我可以是一个简单的过程,例如

    public static bool Run(Action a)
    {
        try
        {
            a();
            return true;
        }
        catch(Exception ex)
        {
            //custom error handling here
            return false;
        }
    }

示例电话:

    private void button1_Click(object sender, EventArgs e)
    {
        Run( ()=>throw new Exception());
    }

在标准方法中运行具有额外的好处,即能够将事物控制为等待光标或记录。如果它不是mdi环境,那么会有一些替代方案,但希望这个是可行的。