【问题标题】:Suppress unhandled exception dialog?抑制未处理的异常对话框?
【发布时间】:2010-04-04 16:33:23
【问题描述】:
我正在处理代码中所有未处理的异常,但是每当发生异常时(不是在调试期间),我都会看到错误窗口,并且一旦它关闭“您的应用程序中发生了未处理的应用程序异常”窗口弹出。如何抑制它?
PS:我没有使用 ASP.NET,我使用的是 Windows 窗体
【问题讨论】:
标签:
c#
exception-handling
【解决方案1】:
你不能抑制AppDomain.UnhandledException。发生了一件非常糟糕的事情,你程序中的一个线程死于心脏病发作。程序继续以有意义的方式运行的可能性为零,.NET 通过终止程序来结束痛苦。
为AppDomain.CurrentDomain.UnhandledException 事件编写一个事件处理程序并记录或显示e.ExceptionObject.ToString() 的值,这样您就知道是什么导致了事故。这为您提供了如何修复代码的提示。如果有的话,很可能是您无法自行解决的问题。例如,某种数据库服务器故障。因此,故意隐藏错误是一个非常糟糕的主意。您客户的支持人员将不知道该怎么做。
【解决方案2】:
对于 Windows 窗体,您可以通过在 Main() 方法中添加以下内容,在调用 Application.Run() 方法之前将未处理的异常(否则会导致未处理的异常窗口弹出)发送到您的异常处理程序:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
您可以通过将以下内容添加到表单的构造函数或其他地方来为您的处理程序订阅未处理的异常事件:
Application.ThreadException += myHandler;
您的表单的处理程序方法如下所示:
void myHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
//do something
}
您可以在msdn 上找到更多相关信息。
【解决方案3】:
这是一个显示所有未处理异常的解决方案,包括托管和非托管类型:
static void Main() {
try {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException +=
new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.Run(new Form1());
}
catch (Exception ex) {
MessageBox.Show("A fatal error has occurred. Please contact your admin\n" +
"Exception type: " + ex.GetType() + "\n" +
"Exception Message: " + ex.Message + "\n" +
ex.StackTrace, "Fatal Exception");
if (ex.InnerException != null) {
MessageBox.Show("Inner Exception:\n" +
"Exception type: " + ex.InnerException.GetType() + "\n" +
"Exception Message: " + ex.InnerException.Message + "\n" +
ex.StackTrace, "Fatal Exception (inner)");
}
}
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
throw new Exception(e.Exception.Message, e.Exception);
}
为了测试这一点,我使用 C++/CLI 抛出了一个非托管异常。除非存在上述 Application_ThreadException 处理程序,否则这些将不会被正确捕获。