我在一个大型项目中读取代码,其中包含许多代码,如:
try
{
}
catch(...)
{
}
从字面上看,在“捕获”之后的括号中,其中有“......”。不像“例外e”。
这让我有点担心。 这种做法是好还是安全? 感谢。
答案 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处理程序中调用的函数。该 重新抛出异常对象是原始异常对象(不是 复制)。例如:
希望这有帮助!
只有在为异常编写适当的处理程序时,此操作才是安全的。在我看来,避免它更好。