在g++
和clang++
(至少在 Linux 中)中,在抛出异常而不是捕获(未捕获的异常)之后显示以下典型消息:
terminate called after throwing an instance of 'std::runtime_error'
what(): Bye
例如在:
#include<stdexcept>
int main(){
throw std::runtime_error("Bye");
}
如何在仍然可以完全访问抛出的异常的同时自定义错误消息?
文档(http://www.cplusplus.com/reference/exception/set_unexpected/)提到set_unexpected
(和set_terminate
)但我不知道如何unexpected_handle
实际访问被抛出的异常,例如调用e.what()
或其他东西。
注意:这背后的原因是我想为一个更复杂的异常类层次结构定制消息,它比简单的信息更多what()
,如果抛出这种类型的异常,我想显示它(但如果std::exception&
抛出一个简单的默认值是和典型的一样。
Note2:根据目前的两个建议,“通过捕获异常来自定义未捕获的异常”。看起来像代码中的内容。我想知道是否有一种方法可以在不向我编写的所有try-catch
代码中添加块的情况下做同样的事情。 main()
#include<stdexcept>
int main() try{
....
}catch(std::exception& e){
std::clog << "terminate called after throwing an instance of '" << typeid(e) << "'\n"
<< " what(): " << e.what() << '\n'
<< "otherinfo, like current time\n";
}catch(alternative_exception& e){
std::clog << "terminate called after throwing an instance of '" << typeid(e) << "'\n"
<< " what(): " << e.what() << '\n'
<< " where(): " << e.where() << '\n'
<< " how(): " << e.how() << '\n'
<< "othermember(): " << e.othermember() << '\n';
}