在我的内部日志库中,我试图将自定义异常类更改为派生自boost :: exception而不是std :: exception。我这样做,以便我可以使用单个catch块来同时提升异常和我的应用程序异常。但是我在登录时遇到了一个问题。
使用boost :: diagnostic_information()记录异常时,我得到了关于throw位置的整个9码。这些信息对我来说是多余的,因为我的自定义类已经以我想要的方式收集和使用此信息。我不想在日志中打印源代码文件/行/功能信息。
如果我定义BOOST_EXCEPTION_DISABLE或不使用BOOST_THROW_EXCEPTION,则每次记录异常时都会打印“丢弃位置未知(考虑使用BOOST_THROW_EXCEPTION)”。
但是如何摆脱这种唠叨?
答案 0 :(得分:4)
好吧,我想我自己找到了答案。首先,我不必从boost :: exception派生我的类,我仍然可以继续从std :: exception派生。但是,我应该使用BOOST_THROW_EXCEPTION抛出我的std :: exception派生类。所以当它起飞时它变成了boost :: exception。 : - )
在两者之间,如果需要捕捉和重新抛出,我可以添加更多信息。
typedef boost::error_info<struct tag_errmsg, std::string> exceptionInfo;
catch (boost::exception &e)
{
e << exceptionInfo("some more exception data");
throw;
}
然后我终于可以抓住它并以这种方式打印出来:
catch (boost::exception &e)
{
std::exception const * se = dynamic_cast<std::exception const *>(&e);
if(se)
{
// will enter here only for my application exception and not for pure boost exception
std::cout << "STD: " << se->what();
}
std::cout << " BOOST: " << *boost::get_error_info<exceptionInfo>(e); }
}
这样我将从std :: exception获取what()字符串,并从boost :: exception获取错误消息。我是在正确的轨道上吗?
答案 1 :(得分:0)
你不想使用exception :: what()而不是boost :: diagnostic_information()吗?