【发布时间】:2016-01-14 21:55:22
【问题描述】:
C++ Primer 中的一个练习题
为什么 [异常类] 的 what 函数不抛出很重要?
由于无法检查我的答案,我希望得到意见。我认为在当前异常对象仍在处理时,在 catch 子句期间抛出另一个异常(而不是重新抛出 throw;)可能是一个错误(可能会调用 terminate)。但似乎情况并非如此,完全可以抛弃 catch 子句:
#include <iostream>
using namespace std;
int main(){
try{
try{
throw exception();
} catch(exception err){ throw exception();}
} catch(exception err){ cout << "caught"} //compiles and runs fine, outputs "caught"
}
所以程序终止不必担心。看来,what() 抛出的任何问题至少应该由用户纠正,如果他们愿意的话。
也许那么重要的是,在处理错误时,我们不希望发生更多意外错误? catch 子句中的抛出主要用于将异常对象进一步发送到调用链的上游。用户可能会从他的程序深处收到一个错误,并且不想担心捕获的错误必须与它自己的 try 块相关联。或者可能 what() 有自己的 throw 也可能导致递归效果(例如 what() 抛出一个异常,然后我们捕获这个异常并调用 what() 但这然后抛出,等等)意味着它可能变得无法处理有什么错误吗? what() 可能会抛出多厉害?
【问题讨论】:
-
如果您在尝试处理第一个异常时遇到完全不相关的异常,则您基本上失去了处理第一个异常的所有能力,因为下一个
catch只会看到第二个异常。 -
what 用于确定它是什么类型的异常(因此您可以决定如何处理它)。投掷是不公平的,结果只会发生坏事。当然 BT 总是会发生 - 你的处理器着火了,但“什么”作者不能将异常作为其异常的正常行为的一部分
-
std::exception::what()是例外。这个问题应该是心理锻炼还是..?