替换 Windows 窗体中默认的未处理错误对话框
本文关键字:未处理 错误 对话框 默认 Windows 窗体 替换 | 更新日期: 2023-09-27 18:36:12
目前,当我的Windows窗体程序中的一个窗体中存在未处理的错误时,会弹出一个对话框,其中包含许多与最终用户无关且令人困惑的详细信息。
每当我的一个表单中发生未经处理的错误时,我想将该对话框替换为更用户友好的对话框(并使用选项卡式界面隐藏但提供技术详细信息)。
有没有办法用自定义对话框替换此默认对话框?
我的应用程序是 MDI 应用程序,因此如果表单中发生错误,我想关闭该表单,以友好的方式显示错误,并允许它们使用应用程序中的其他窗口(除非是严重错误)。
有几个方法浮现在脑海中。最简单的方法是通过侦听 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 环境,会有一些替代方案,但希望这个是可行的。