在函数参数中捕获异常

时间:2013-11-28 09:22:24

标签: c# .net exception

我正在测试.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?我不能只使用捕获,它必须尝试 - 捕捉......

3 个答案:

答案 0 :(得分:4)

你不能以你的方式压制异常;这只是一个做日志记录等事情的机会; from MSDN

  

此活动仅为通知。处理此事件不会以任何方式处理异常或影响后续异常处理。

答案 1 :(得分:4)

嗯,当然它没有达到catch子句。无意中,您创建了一个递归:

  1. 您的计划中某处发生了第一次机会异常。
  2. 您的处理程序正在被触发。
  3. 处理程序中有第一次机会异常,woops!最好去我的异常处理程序!
  4. 您的处理程序正在被触发。
  5. 处理程序中有第一次机会异常,woops!最好去我的异常处理程序!
  6. 您的处理程序正在被触发。
  7. 处理程序中有第一次机会异常,woops!最好去我的异常处理程序!
  8. 您的处理程序正在被触发。
  9. 处理程序中有第一次机会异常,woops!最好去我的异常处理程序!
    ...
  10. 并且你的堆栈溢出......

    正如@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是一种可以记录错误或发送通知的方法(抛出错误除外)。