关于c ++ try -catch

时间:2011-09-19 18:41:16

标签: c++ exception

我在一个大型项目中读取代码,其中包含许多代码,如:

try
{
}
catch(...)
{
}

从字面上看,在“捕获”之后的括号中,其中有“......”。不像“例外e”。

这让我有点担心。 这种做法是好还是安全? 感谢。

3 个答案:

答案 0 :(得分:11)

不,这是一种可怕的做法。

如果你catch(...),你根本不知道你抓到了什么。它捕获所有C ++异常(在某些平台上有一些设置,它也会捕获其他异常,比如Visual C ++中的结构化异常)。

如果你不知道抛出了什么异常,你就不知道系统的状态是什么:你怎么知道程序继续运行是否安全?

退出catch(...)块绝对安全的唯一两种方法是终止程序或重新抛出异常(使用throw;)。如果您在抛出异常时需要执行一些清理但不能依赖析构函数,则后者偶尔会有用。

答案 1 :(得分:3)

catch(...)捕获所有例外。

通常情况下,你不想这样做。你不知道你刚抓到了什么,如果你离开catch块,你就会默默地忽略某种错误。这可能导致后来发生的非常糟糕的事情。由于你不知道刚刚发生了什么错误,你无法从中恢复,因此唯一合理的做法是允许异常继续(重新抛出)或中止程序的执行(call {{ 1}}或abort())。

但是,如果你需要执行一些清理,捕获所有异常,执行清理,然后重新抛出异常可能是合理的:

exit()

也就是说,通常最好使用所谓的RAII classes来自动清理:

try {
  // ...
} catch (...) {
  abortTransaction();
  throw;
}

答案 2 :(得分:1)

它捕获所有异常。看到这段代码:

try {
   throw CSomeOtherException();
}
catch(...) {  // Handle all exceptions
   // Respond (perhaps only partially) to exception
   throw;       // Pass exception to some other handler
}

来自MSDN

  

您无需声明此参数;在许多情况下它可能是   足以通知处理程序特定类型的异常   已经发生了。但是,如果您未在中声明异常对象   异常声明,您将无法访问该对象   catch处理程序子句。

     

没有操作数的throw-expression当前重新抛出异常   被处理。这样的表达式应该只出现在一个catch中   处理程序或在catch处理程序中调用的函数。该   重新抛出异常对象是原始异常对象(不是   复制)。例如:

希望这有帮助!

只有在为异常编写适当的处理程序时,此操作才是安全的。在我看来,避免它更好。