C++ 如何正确捕获std和boost异常
请告诉我如何在boost::exception中正确使用try/catch 这是一个例子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
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
wrappsprintf
以某种方式),您可以执行以下操作:
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,当然。羞耻似乎没有被证明是明显的任何地方(虽然公平,我不很难看)