即使在调用堆栈中处理更高的异常,是否可以强制try-catch?

时间:2017-06-21 11:12:41

标签: c# exception exception-handling try-catch throw

示例 - A() - > B() - > C()

C()包含try-catch,只需记录异常并继续执行,因为throw;已被注释掉。

因此A()中的try / catch不会触发。

public void A(){
   try{
      B();
   }
   catch(Exception e){
      //something really important
   }
}


public void B(){
   try{
      throw new Exception("test");
   }
   catch(Exception e){
      Log.Error($"Error - {e.InnerException}");
      //throw;
   }

   //further code
}

是否有任何机制强制A()catch捕获后面的调用堆栈中引发的任何异常?

我问的原因是我需要确保报告付款的任何问题但是在B()的代码中必须有40多次尝试捕获;包含!

2 个答案:

答案 0 :(得分:3)

不,除非重新抛出异常,否则无法捕获已处理的异常:

try
{
   B();
}
catch(Exception e)
{
    // handle the exception

    throw; // then re-throw it.
}

如果是用于记录目的,您可能正在寻找AppDomain.FirstChanceException事件,这使您能够“捕获”异常,即使它们已被处理。

答案 1 :(得分:1)

没有

没有。您需要信任B()来完成它的工作,并准确地报告结果。

B()没有任何保护:

public bool B()
{
   var failed = ImportantOperation();

   if(failed) 
      // oops
      return true;
   else
      return true;
}

如果您不信任代码,请自行编写代码或获得您可信赖的代码提供程序。