如何正确捕获std和boost异常
How to properly catch std and boost exceptions
请告诉我如何正确使用try/catch与boost::exception。
这是其中一个例子
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吗?我不能让我的应用程序失败,所以我只需要记录所有内容。
乌利希期刊指南:我现在也无法理解从异常中检索日志信息??
std::exception
有一个名为what()
的成员函数,该函数返回一个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
来了解更多关于它的信息
现在回答可能太晚了…但
<...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...>
与任何c++一样,以下通用规则适用:
捕捉所有可能抛出的异常,并且只有在可以有意义地响应它们时才捕捉。
您可以捕获所有其他异常(...
),并创建一个日志消息或类似的东西,但随后您必须重新抛出它们(throw;
)。如果在代码中除了中止某些操作之外什么也做不了,那么就不需要处理异常。让它冒泡到一个可以被有意义地使用的地方。
在您的代码中,您必须至少允许内存分配错误(std::bad_alloc
),因此您可以检查这些错误,如果有意义的话。但是,如果你不知道你钓到的是什么,那么你对你钓到的东西就无能为力了。
说你的"程序不能失败"只能意味着这么多。最终,如果在顶级数据结构中出现了分配错误,那么就无能为力了。我能想到的最好的情况是,如果你的main函数在循环中处理一些数据;在这种情况下,你可以在循环中放置一个通用的try块,在出现异常的情况下,你可以继续进行下一轮。但我认为这是能够"有意义地处理异常"的一个实例,所以这只是上面的一个特殊情况。一般来说,虽然您可能希望将整个main函数包装在try块中,但您必须接受这样的事实:在最终的全面捕获情况下,您没有太多选择,只能中止程序。
这取决于你在try块中运行的代码。如果read_xml中的代码可能抛出std::异常,那么最好也捕获std::异常。如果你不确定,那么抓住他们两个也无妨。
如果您真的想做一些与特殊异常类型相关的事情,您应该只catch
特殊异常类型。否则就使用std::exception
。如果你的代码可能会抛出不同的东西,那就捕获...
,或者在std::exception
之后。
如果你想处理多个(特殊的)异常类型,那么你需要首先处理最显式的异常。
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 如何使用 boost::future 重新抛出 std::exception_ptr 存储的原始异常?
- boost::ifind_first 会引发什么样的异常?
- boost::create_directory 在发布模式下返回异常
- 在 Boost.Test 中异常时双倍释放
- 在无效地址上,boost::asio::ip:::address::from_string 没有引发异常
- 从 boost::存档:binary_iarchive 反序列化 std::string 时出现错误的分配异常
- 从静态库使用 Boost Asio 时访问冲突异常
- boost::p rogram_option::store 在选项字符串包含混合语言字符时引发异常
- 无法从boost::asio::io_service::run捕获异常
- boost::iostreams::mapped_file_sink 抛出未知异常
- 当io_service被螺纹时,在boost.asio中进行异常处理
- 无法使用Boost Gil检测图像FILETYPE(未捕获异常)
- 我如何从boost ::异常获得更好的诊断信息
- 尝试ping时出现Boost异常
- 如何使用boost异常将信息添加到std::异常中
- 使用零长度元组的boost异常,如何解决
- 如何正确捕获std和boost异常
- linux上RCF的boost异常
- 记录boost::异常,同时避免文件/行/函数和唠叨