我正在测试.NET应用程序中的异常处理。使用下面的代码,我可以记录所有异常,但我不知道如何捕获它们,因此它们不会停止我的应用程序。 这是我正在使用的代码:
public class ExceptionHandler
{
public ExceptionHandler()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.FirstChanceException += MyHandler2;
}
private void MyHandler2(object sender, FirstChanceExceptionEventArgs e)
{
try
{
throw e.Exception;
//this ends up in eternal loop with 'stack overflow'
}
catch (Exception exception)
{
//exception never comes here, but if the exception is
//not caught inside catch block, then it's unhandled and it stops application
}
}
}
那么,如何在MyHandler2中捕获异常e?我不能只使用捕获,它必须尝试 - 捕捉......
答案 0 :(得分:4)
你不能以你的方式压制异常;这只是一个做日志记录等事情的机会; from MSDN:
此活动仅为通知。处理此事件不会以任何方式处理异常或影响后续异常处理。
答案 1 :(得分:4)
嗯,当然它没有达到catch子句。无意中,您创建了一个递归:
并且你的堆栈溢出......
正如@Marc Gravell在他的回答中所指出的,这个事件不是用于处理异常。例外情况应在当地处理 有关详细信息,请查看this SO thread。
答案 2 :(得分:1)
为什么要再次抛出异常?只是在MyHandler2中处理e.Exception。 FirstChanceException处理程序将在CLR之前接受它,因此它永远不会到达MyHandler2中的Catch块并再次调用MyHandler2,因此它将变为递归并最终在StackOverflow中。
正如马克所解释的那样:
此活动仅为通知。处理此事件不会以任何方式处理异常或影响后续异常处理。
以下是获取(获得通知)的唯一方法:
private void MyHandler2(object sender, FirstChanceExceptionEventArgs e)
{
//Never throw here
//throw e.Exception;
GetNotified(e.Exception);
}
此处GetNotified是一种可以记录错误或发送通知的方法(抛出错误除外)。