我有这段代码:
printf("hello\n");
try
{
for ( unsigned i = 0; i < par.size(); i++ )
rep.delete_rev(par[i]);
}
catch(TriedToDeleteRoot e)
{
printf("catched 1 !\n");
}
catch(...) {
printf("catched sth else !\n");
}
printf("hahaha\n");
这就是我对输出的看法:
hello
terminate called after throwing an instance of 'TriedToDeleteRoot'
what(): Tried to delete root
为什么呢? TriedToDeleteRoot继承自std :: exception,我不知道出了什么问题。感谢。
编辑: 这是我抛出异常的方式:
throw TriedToDeleteRoot();
答案 0 :(得分:4)
我的猜测是TriedToDeleteRoot的复制构造函数失败。
我建议(一如既往)使用const引用:
try
{
for ( unsigned i = 0; i < par.size(); i++ )
rep.delete_rev(par[i]);
}
catch(const TriedToDeleteRoot& e)
{
printf("caught 1 !\n");
}
或在一般情况下:
catch(const std::exception& e)
{
std::cerr << "exception: " << e.what() << std::endl;
}
答案 1 :(得分:1)
即使你有一个std::terminate
/ try
,你希望与被抛出的异常相匹配,你仍然会注意到catch
正在被召唤。< / p>
这可能发生的一个原因是,如果您在处理上一个异常时设法抛出异常。您可以通过以下方式观察:
#include <iostream>
int main() {
try {
struct test {
~test() { throw 0; }
} test;
throw 0;
}
catch (...) {
std::cout << "Caught something" << std::endl;
}
}
在我的系统上,这会调用abort()
并打印:
在抛出&#39; int&#39;
的实例后终止调用
请注意,catch(...)
因此而永远不会被击中。
这个简单的例子说明了意外发生这种情况的最简单方法 - throwing from within a destructor。我从你所展示的内容中得到的最好的猜测是,这就是正在发生的事情。调试器应该为你确认这一点。