如何正确捕获std并增加异常

时间:2011-11-15 12:45:32

标签: c++ boost logging exception-handling

请告诉我如何使用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: 我现在也无法理解从异常???

中检索日志记录的信息

5 个答案:

答案 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

如果要处理多个(特殊)异常类型,而不是首先处理最明确的异常类型。