我正在尝试崩溃我的WPF应用程序,并使用上面的新.NET 4属性捕获异常。
我设法通过调用Environment.FailFast("crash");
手动崩溃我的应用程序。
(我还设法使用来自“How to simulate a corrupt state exception in .NET 4?”的汉斯代码来崩溃它。)
按下按钮时,应用程序会调用上面的崩溃代码。 这是我的异常处理程序:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
DispatcherUnhandledException += app_DispatcherUnhandledException;
}
[HandleProcessCorruptedStateExceptions]
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//log..
}
[HandleProcessCorruptedStateExceptions]
void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
//log..
}
[HandleProcessCorruptedStateExceptions]
void app_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//log..
}
上面显示的//log...
评论仅供参考;那里有真正的日志记录代码。
在Visual Studio中运行时,会抛出异常,但它不会“冒泡”到这些异常处理程序块。 当作为独立运行时(没有附加调试器),我没有得到任何日志,尽管我期望。
为什么会这样,以及如何处理代码?
答案 0 :(得分:5)
该属性必须放在包含try / catch而不是事件处理程序的方法中。
的回答中提供了一个示例答案 1 :(得分:2)
答案基于这篇文章:www.naveenbhat.in/2013/02/tips-and-tricks-of-exception-handling_28.html
答案 2 :(得分:1)
必须使用[HandleProcessCorruptedStateExceptions]
和[SecurityCritical]
标记事件处理程序才能触发事件处理程序。 FirstChanceException
和UnhandledException
的备注部分提到了此要求。
DispatcherUnhandledException
的评论并未声明您可以处理其中的损坏状态异常,因此可能无法使用该事件。
另请注意,在备注中,强烈建议您在约束执行区域内创建FirstChanceException
,以防止无限循环的堆栈溢出或内存不足异常。