Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.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++ - Fatal编程技术网

C++ 异常重排序

C++ 异常重排序,c++,C++,以下两者之间的区别是什么: foo(); 及 据我所知,如果调用foo()的函数中没有try-catch块,则异常将被外部函数的try-catch块捕获(如果有)。我说的对吗 但是,如果在调用foo()的函数中有一个try-catch块,但没有能够处理它的catcher,那该怎么办?我必须编写catch(…){throw;}以让它被它之外的人捕获吗?有必要吗 不带操作数的抛出表达式将重新抛出正在执行的异常 处理。[§15.1/8] 因此,在实践中也有同样的情况 外部函数的try-catch块

以下两者之间的区别是什么:

foo();

据我所知,如果调用foo()的函数中没有try-catch块,则异常将被外部函数的try-catch块捕获(如果有)。我说的对吗

但是,如果在调用foo()的函数中有一个try-catch块,但没有能够处理它的catcher,那该怎么办?我必须编写catch(…){throw;}以让它被它之外的人捕获吗?有必要吗

不带操作数的抛出表达式将重新抛出正在执行的异常 处理。[§15.1/8]

因此,在实践中也有同样的情况

外部函数的try-catch块将捕获异常(如果 有任何问题)。我说的对吗

但如果调用foo()的函数中存在try-catch块,该怎么办, 但是没有一个接球手能处理这个问题——我必须写接球(…){ 扔;}让它被外面的人抓住?有必要吗

处理期望您在调用点中处理的异常,并保留其他异常。你不必再扔了。如果没有捕获程序,则最终捕获异常
std:terminate
将被调用

try
{
    foo();
}
catch (YourExpectedException &ex)
{
  // ...
}
catch (...)    \
{               \
                 > // You don't need this kind of re-throwing
    throw;      /
}              /

仅捕获您可以处理的内容,或者如果您需要进行本地清理。仅重新抛出的捕获全部基本上是不可操作的,没有任何用途。异常通常应在最适合的级别进行处理。因此,如果
foo()
对某些异常进行了异常处理,那么它只知道如何处理这些异常。其他一切都会向上传播,如果调用
foo()
的函数知道如何处理所有异常情况,那么
通常是可以的-意味着您知道自己在做什么。或者,在这里处理特定的异常也可能更好,让未知的异常传播。。。所以,总而言之,这取决于抛出的内容……这取决于您的设计。我更喜欢尽可能靠近提出异常的地方处理异常。这是因为异常不应该是正常代码流的一部分,而只能在发生错误时发生,并且必须尽快解决错误。如果未捕获异常,程序通常以错误代码结束。在本地检查代码,可以确保
foo
的堆栈帧已展开。没有它,甚至可能没有另一个
catch
块来处理它,堆栈也可能不会展开。谢谢您的回答!
try
{
    foo();
}
catch (YourExpectedException &ex)
{
  // ...
}
catch (...)    \
{               \
                 > // You don't need this kind of re-throwing
    throw;      /
}              /