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

本文关键字:未处理 错误 对话框 默认 Windows 窗体 替换 | 更新日期: 2023-09-27 18:36:12

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

每当我的一个表单中发生未经处理的错误时,我想将该对话框替换为更用户友好的对话框(并使用选项卡式界面隐藏但提供技术详细信息)。

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

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

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

有几个方法浮现在脑海中。最简单的方法是通过侦听 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 环境,会有一些替代方案,但希望这个是可行的。