Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于c++;试捕_C++_Exception - Fatal编程技术网

C++ 关于c++;试捕

C++ 关于c++;试捕,c++,exception,C++,Exception,我在一个大型项目中阅读代码,其中包括很多代码,如: try { } catch(...) { } 字面上,在“catch”后面的括号中,有“…”。不是“例外e”之类的东西 这让我有点担心。 这种做法好还是安全? 谢谢。不,这是一种糟糕的做法 如果你捕获(…),你不知道你捕获了什么。它捕获所有C++异常(在某些平台上有一些设置,它也捕捉其他异常,如VisualC++中的结构化异常)。 如果您不知道抛出了什么异常,那么您就不知道系统的状态是什么:如何知道程序继续运行是否安全 退出catch(…)块

我在一个大型项目中阅读代码,其中包括很多代码,如:

try
{
}
catch(...)
{
}
字面上,在“catch”后面的括号中,有“…”。不是“例外e”之类的东西

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

不,这是一种糟糕的做法

如果你
捕获(…)
,你不知道你捕获了什么。它捕获所有C++异常(在某些平台上有一些设置,它也捕捉其他异常,如VisualC++中的结构化异常)。 如果您不知道抛出了什么异常,那么您就不知道系统的状态是什么:如何知道程序继续运行是否安全


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

它捕获所有异常。请参阅此代码:

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

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

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

希望这有帮助

只有在为异常编写了适当的处理程序时,这种做法才是安全的。在我看来,避免它更好。

捕获(…)捕获所有异常

通常,您不想这样做。您不知道刚刚捕获的是什么,如果您离开catch块,您只是默默地忽略了某种错误。这可能会导致以后发生非常糟糕的事情。由于您不知道刚刚发生了什么错误,因此无法从中恢复,因此唯一合理的做法是允许异常继续(重新抛出它)或中止程序的执行(调用
abort()
exit()

但是,如果需要执行某些清理,则可以捕获所有异常,执行清理,然后重新抛出异常:

try {
  // ...
} catch (...) {
  abortTransaction();
  throw;
}
也就是说,通常最好使用所谓的自动清理:

DBTransaction txn = db.StartTransaction();

// do stuff that may throw; if it throws, txn will be destroyed,
// and its destructor can abort the transaction
// As such, an explicit try { } catch(...) { } isn't needed

如果您需要进行一些清理,并使用
throw完成后重新抛出。当然,使用RAII类会更好。@bdonlan:你完全正确,我认为在某些情况下,当你自己编写RAII容器时,使用
catch(…)
可能会很有用(我不记得曾经这样做过,但我想这是可能的).堆栈展开期间从析构函数引发的异常会中止程序;在RAII容器中,当析构函数中发生异常时,显式中止程序确实很有用,以确保即使没有执行堆栈展开,也会发生中止。我想这是某种通配符?其他人能确认吗?@MGZero,是的,这是一个通配符,它捕获所有内容。重复的