我在一个非常大的C#应用程序上工作。一个太大,现在去捕捉所有可能的未处理的例外。
该应用程序还有一个"您确定要退出吗?"消息在应用程序的FormClosing事件中弹出。
当遇到未处理的异常时,用户有时会点击退出按钮。我相信这会调用Application.Exit()或某种形式。这也会触发FormClosing事件和弹出窗口。
此时,弹出窗口中是否单击“是”或“否”无关紧要。由于Application.Exit(),应用程序将在收到答案后退出。
无论如何都要阻止调用Application.Exit()吗?
答案 0 :(得分:1)
如果您需要阻止应用程序终止,则需要处理该异常。在每个可能抛出异常的地方都有一个try..catch是合理的(不应该有很多)。但是,有一个全球性的事件。
如果未处理主线程中的异常并传播到AppDomain Unhandled Exception,则该应用程序不处于有效状态且必须为terminate。您最后希望在此阶段记录异常信息并尝试保存在应用程序终止之前可以保存的内容。
您需要订阅此活动才能记录未处理的异常并显示用户友好的错误:
static void Main()
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// we can log info from e.ExceptionObject and check e.IsTerminating
}
在.NET Framework 1.0和1.1版中,出现未处理的异常 发生在主应用程序线程以外的线程中 由运行时捕获,因此不会导致应用程序 终止。因此,UnhandledException事件可能是 在没有申请终止的情况下提出。从.NET开始 框架版本2.0,这个支持未处理的子例外 线程被删除了,因为这种沉默的累积效应 失败包括性能下降,数据损坏和 锁定,所有这些都很难调试。欲获得更多信息, 包括运行时未终止的案例列表,请参阅 Exceptions in Managed Threads
您可能还需要处理:
Application.ThreadException += Application_ThreadException;