请告诉我如何使用boost :: exception正确使用try / catch。
这是一个例子
void Settings::init(const std::string &filename)
{
using boost::property_tree::ptree;
try
{
read_xml(filename, pt);
}
catch(boost::exception const& ex)
{
LOG_FATAL("Can't init settings. %s", /* here is the question */);
}
}
我是否也需要catch std :: exception? 我不能让我的应用程序失败,所以我只需要记录所有内容。
UPD: 我现在也无法理解从异常???
中检索日志记录的信息答案 0 :(得分:12)
std::exception
有一个名为what()
的成员函数,它返回{em}可能解释发生了什么的const char*
。如果你想记录它(猜测LOG_FATAL
以某种方式包裹printf
)你可以这样做:
catch(std::exception const& ex)
{
LOG_FATAL("Can't init settings. %s", ex.what());
}
对于boost::exception
,您可以使用boost::get_error_info
了解更多信息。
答案 1 :(得分:6)
回答可能是太晚了......但是
<...snip...>
catch (const boost::exception const& e)
{
std::string diag = diagnostic_information(e);
// display your error message here, then do whatever you need to, e.g.
LOG_FATAL("Can't init settings. %s", diag);
}
<...snip...>
答案 2 :(得分:5)
与任何C ++一样,以下通用规则适用:
抓住可能抛出的所有异常,只有如果你可以有意义地回应它们。
您也可以捕获所有其他异常(...
)并创建日志消息或类似内容,但您必须重新抛出它们(throw;
)。如果除了中止某些操作之外,您在代码中无能为力,那么您不需要处理异常。让它冒泡到可以有意义地使用的地方。
在您的代码中,您必须至少允许内存分配错误(std::bad_alloc
),以便在有意义的情况下检查这些错误。但是,如果你不知道自己捕获的是什么,那么你所捕获的东西并不多。
说你的“程序不能失败”只能意味着这么多。最终,如果您在顶级数据结构中存在分配错误,那么您可以做什么。我能想象的最佳场景是你的main函数是否在循环中处理一些数据;在这种情况下,您可以在循环周围放置一个通用try块,如果出现异常,您只需转到下一轮。但我认为这是一个能够“有意义地处理异常”的例子,所以这只是上述的一个特例。一般情况下,虽然您可能希望将整个main函数包装在try块中,但您必须接受这一点,在最终的catch-all情况下,您没有太多选择,只能中止该程序。
答案 3 :(得分:1)
这取决于您在try块中运行的代码。如果read_xml中的代码可以抛出std :: exception,那么最好还是捕获std :: exception。如果你不确定,那么抓住它们就不会真的受伤。
答案 4 :(得分:0)
如果您真的想要做与该类型相关的事情,您应该catch
只有特殊的异常类型。否则只需使用std::exception
。如果你的代码可能会抛出不同的东西,而不是抓住...
代替std::exception
。
如果要处理多个(特殊)异常类型,而不是首先处理最明确的异常类型。