Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确捕获std和boost异常_C++_Boost_Logging_Exception Handling - Fatal编程技术网

C++ 如何正确捕获std和boost异常

C++ 如何正确捕获std和boost异常,c++,boost,logging,exception-handling,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) { L

请告诉我如何在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:
我现在也无法理解如何从异常中检索日志信息???

,这取决于您在try块中运行的代码。如果read_xml中的代码可以抛出std::exception,那么最好也捕获std::exception。如果您不确定,那么捕获这两种类型并没有什么坏处。

如果您确实想执行与该类型相关的操作,您应该
只捕获特殊异常类型。否则只需使用
std::exception
。如果您不确定,代码可能会抛出与catch
不同的内容,而不是在
std::exception
之后抛出


如果要处理多个(特殊)异常类型,首先需要处理最显式的异常类型。

std::exception
有一个名为
what()
的成员函数,该函数返回一个
const char*
,可以解释发生了什么。如果您想记录它(猜测
log\u FATAL
wrapps
printf
以某种方式),您可以执行以下操作:

catch(std::exception const&  ex)
{
    LOG_FATAL("Can't init settings. %s", ex.what());
}

<代码> > Boo::异常< /代码>,尽管您可以使用它来了解更多信息。

< P>与任何C++一样,以下通用规则适用:

捕获所有可能抛出的异常,并且仅当您能够有意义地响应它们时

您还可以捕获所有其他异常(
)并创建日志消息或类似的内容,但随后必须重新浏览它们(
抛出;
)。如果在代码中除了中止某些操作之外,您什么也做不了,那么您就不需要处理异常。让它冒泡到一个可以有意义地使用它的地方

在您的代码中,您必须至少允许内存分配错误(
std::bad_alloc
),这样您就可以检查这些错误,如果这有意义的话。但是,同样,如果你不知道你在抓什么,你就不能用你抓的东西做什么


说你的“程序不能失败”只能意味着这么多。最终,如果在顶级数据结构中出现分配错误,您将无能为力。我能想象的最好的情况是,如果主函数在循环中处理一些数据;在这种情况下,您可以在循环中放置一个通用try块,如果出现异常,您只需进入下一轮。但我认为这是能够“有意义地处理异常”的一个例子,所以这只是上述情况的一个特例。一般来说,虽然您可能希望将整个主函数包装在一个try块中,但您必须接受,在最终的“一网打尽”的情况下,您除了中止程序之外别无选择。

回答这个问题可能太晚了。。。但是

        <...snip...>
        catch (const boost::exception& 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...>

捕获(常量boost::异常&e)
{
std::string diag=诊断信息(e);
//在此处显示错误消息,然后执行所需的操作,例如。
日志\u致命(“无法初始化设置。%s”,diag);
}

是的,我也会在boost::exception之后添加std::exception。如果由于发生错误而引发异常,我还将添加catch(…),那么简单地捕获异常并不能消除错误。你的应用程序仍然失败,你只是让它更难看到发生了什么。因此,只有当您知道异常指示的内容并且能够有意义地处理异常时,才能捕获异常them@jalf上面的代码并没有简单地吞下异常。至少有一些日志记录。伙计们=)这现在不是那么重要了。你最好告诉我UPDUPD的事?什么是UPD?我认为在一个关于如何正确捕获异常的问题中,讨论如何捕获异常非常关键尽管要从
boost::exception
访问
what()
,您需要捕获或
dynamic\u cast
到,
std::exception
。除非我弄错了,否则boost::exception不会从std::exception继承,因此您在其上调用.what()的示例无效。另外,我认为std::exception通常返回const char*,而不是std::string@obmarg你错了<代码> catch(Boo::异常const & e){couth-Qix),这些天我没有做足够的C++来研究,但看起来像“代码> Boost::异常< /代码>不继承从<代码> STD::异常< /代码>:@ QixAH,当然。羞耻似乎没有被证明是明显的任何地方(虽然公平,我不很难看)