为什么即使我捕获异常类型,我的程序也会从异常中崩溃?

时间:2011-12-15 21:35:35

标签: c++ exception-handling

我有这段代码:

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();

2 个答案:

答案 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。我从你所展示的内容中得到的最好的猜测是,这就是正在发生的事情。调试器应该为你确认这一点。