2

在我的项目编码中,我必须使用 try catch 方法来查找函数执行状态。

   try
   {
      //sample code
      //calling functions
      function1();
      function2();
      //........
   }
   catch(//need to catch exception)
   { 
    return failure;
   }

我的要求是我必须捕获从 try 块抛出的所有异常

我这里有两个选择,

  1. 抓住(...)
  2. 捕捉(标准::异常)

我认为第一个将捕获所有异常。第二个,std::exception 是我程序中所有其他异常类的基类

   class MyException : public std::exception
   {
    // All the exceptions that i have use is derived from this class
   }. 

哪个更好,更有效。

这两种方法的工作方式是否相同。帮助我并提出任何方法

4

3 回答 3

4

在这种情况下,您将按照以下顺序处理可能抛出的类型:

catch (MyException& e) {
  ...
}
catch (std::exception& e) {
  ...
}
catch (...) {
  ...
}

这样,您可以先处理特定的错误/类型,然后在前面的处理程序不匹配时回退到弱(或无类型)处理程序。

哪个更好,更有效。

我推荐的顺序最适合按类型处理。IMO,在这种情况下效率不是问题,因为正确性优先,希望只有在特殊情况下才会抛出异常。

于 2012-04-27T11:11:41.873 回答
1

始终保持您的规范尽可能集中,以便您捕获那些您知道可能被抛出的异常,并在基本异常之前捕获派生异常(更专业):

try
{
    // Some stuff
}
catch (Derived& e)
{
    // Deal with specifics of Derived
}
catch (Base& e) 
{
    // Deal with general case of Base
}

永远不要在程序堆栈的最顶端使用catch(...)except(当然也不要在库中)。当你这样做时,你不能确定是什么导致了异常,因此你不一定要依赖你通常会使用的东西(比如内存管理) ETC。)

于 2012-04-27T11:13:04.103 回答
0

我建议您仅捕获指定的异常并仅在主函数中使用 catch(...) 。在我看来,使用异常的更好方法是每个模块实现一个异常,这样每个类都会抛出与类的模块相关的特定异常,而且不同的异常可能会以不同的方式处理,所以我相信

catch(const ExceptionType1& e){
}catch(const ExceptionType2& e){
}

是更好的解决方案,其他一些仅阅读此代码的开发人员也会看到可以抛出和处理哪种异常......

于 2012-04-27T11:12:16.530 回答