我正在检查C ++异常,并且遇到一个我不确定为什么会给我带来问题的错误:
#include <iostream>
#include <exception>
class err : public std::exception
{
public:
const char* what() const noexcept { return "error"; }
};
void f() throw()
{
throw err();
}
int main()
{
try
{
f();
}
catch (const err& e)
{
std::cout << e.what() << std::endl;
}
}
运行它时,出现以下运行时错误:
terminate called after throwing an instance of 'err'
what(): error
Aborted (core dumped)
如果我将try/catch
逻辑完全移到f()
,即
void f()
{
try
{
throw err();
}
catch (const err& e)
{
std::cout << e.what() << std::endl;
}
}
只需从main
调用它(在main中没有try / catch块),那么就没有错误。我是否不了解某些东西,因为它与从函数中引发异常有关?
答案 0 :(得分:16)
throw()
中的void f() throw()
是dynamic exception specification,自c ++ 11起不推荐使用。应该使用它来列出函数可能抛出的异常。空规范(throw()
)表示函数不会抛出任何异常。尝试从此类函数引发异常时调用std::unexpected
,该函数默认情况下会终止。
从c ++ 11开始,指定函数不能抛出的首选方法是使用noexcept
。例如void f() noexcept
。