为什么我的C ++异常没有被捕获?

时间:2018-02-02 09:06:36

标签: c++ exception exception-handling

我的代码抛出std::runtime_error,但在catch块中没有捕获它。相反,它只调用std::terminate,或者,如果我在函数上声明了异常说明符,则调用std::unexpected

代码简化为:

void myfunc()
{
   throw new std::runtime_error("always throw");
}

int main()
{
    try {
        myfunc();
    } catch (std::runtime_error &err) {
        std::cerr << "intentionally ignored exception: " << err.what() << std::endl;
        return 0;
    }
    std::cerr << "unreachable?" << std::endl;
    return 1;
}

同样,如果我在我的函数上添加throw说明符,我会使用std::unknown崩溃。

void myfunc() throw (std::runtime_error)
{
   throw new std::runtime_error("always throw");
}

1 个答案:

答案 0 :(得分:10)

你陷入了Java主义:

throw new std::runtime_error("always throw")
      ^^^

这会导致catch子句不匹配,因为它按类型匹配并抛出std::runtime_error*,即指向 a std::runtime_error的指针。它期待一个简单的std::runtime_error 按引用

您可以(未经测试)使用

捕获原始异常
catch (std::runtime_error * exc) /* don't do this */

但你不应该这样做。

相反,跳过new;直接抛出你的异常并写下:

void myfunc()
{
   throw std::runtime_error("always throw");
}

C ++非常聪明,如果你通过引用捕获异常,它就不会被复制。

另外,正如@KonradRudolph在评论中指出的那样,你应该通过const-reference来捕捉:

catch (const std::runtime_error &err)