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; /
} /