2

好的,有一个叫做 doProcess() 的函数,我想捕获这个函数内部可能发生的异常。我很困惑,因为有时我注意到如果我们尝试在函数内部或外部捕获异常会有一些不同。所以请告诉我有什么区别,哪种方法更可取?我在 Win 7 中使用 VS C++ 2010。谢谢。

在函数内部捕获..

void doProcess()
{
  try{
      for(int i=0; i<n; i++)
      {
         Performcalculations();
         .
         .
         .
      }
      performanotherProcess();
      .
      .
  }
  catch(exception e) {
      cout<<e.what()<<endl;
  }

}

在回调函数中捕获外部。

void callback()
{
   try{
      doProcess();
   }
   catch(exception e) {
      cout<<e.what()<<endl;
   }
}
4

2 回答 2

4

这取决于哪个级别可以最好地处理异常。视情况而定,您甚至可能希望在较低级别捕获它,执行一些异常处理操作,然后重新抛出它并在较高级别再次捕获它以进一步处理它。

异常处理可能涉及如果没有抛出异常则不执行的特殊操作。示例包括:

  • 记录警告或错误消息
  • 清理资源
  • 修改参数并重新尝试运行失败的函数
  • 在重新抛出之前向异常对象添加信息

对于低级功能,并非所有这些操作都是可能的。例如,记录器可能在低级别不可用,或者某些需要清理的资源可能无法从那里访问。在这些情况下,您需要抛出(或捕获并重新抛出)异常并在更高级别上捕获它。

这完全取决于哪个级别可以访问处理异常所需的资源。多次捕获和重新抛出,或者作为不同的异常类型捕获和重新抛出,也是完全可能的,有时也是正确的做法。


我还应该说,通过引用而不是复制来捕获异常通常是个好主意:

catch (my_exception &e)
{ /*...*/ }

原因包括:a) 您保存了一份副本,b) 您受益于类型多态性(因为异常通常是异常类型的类型层次结构的一部分),c) 您可以以自然的方式调用原始异常的成员函数对象和/或在它被捕获和重新抛出的每个级别上添加信息。如果您不添加信息,而只是捕获(并可能重新抛出),则将其捕获为const-reference 也是可能的。

于 2013-07-16T01:04:37.767 回答
1

在您处理的地方捕获期望,如果您希望 doProcess() 具有期望句柄,那么您应该将 try{} catch(){} 放入 doProcess(),但是如果您希望 doProcess() 可以报告期望,那么只需做投掷工作。这取决于您的代码和您的设计。

于 2013-07-16T03:20:28.107 回答