我的代码抛出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");
}
答案 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)