捕获异常的两种方法,哪种方法更可取?

时间:2013-07-16 00:59:54

标签: c++ visual-c++ exception exception-handling

确定有一个名为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;
   }
}

2 个答案:

答案 0 :(得分:4)

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

异常处理可能涉及在未抛出异常时未执行的特殊操作。例子包括:

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

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

这一切都取决于哪个级别可以访问处理异常所需的资源。捕捉和重新投掷几次,或者作为一种不同的例外类型捕捉和重新投掷,也是完全可能的,有时也是正确的事情。


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

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

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

答案 1 :(得分:1)

捕获你处理的地方,如果你想要doProcess()有预期句柄,那么你应该把do {} {}中的try {} catch(){},但是如果你想要doProcess()可以报告一个预期,然后只是做投掷工作。这取决于您的代码和设计。