【发布时间】:2013-11-17 03:51:16
【问题描述】:
我想知道,自 C++11 以来,添加了在线程之间传递异常并添加了嵌套异常,通常情况下是否会更改用于异常捕获的惯用语。
现在我们有了:
std::rethrow_if_nestedstd::rethrow_with_nestedstd::rethrow_exceptionstd::current_exception
嵌套异常应该用于不丢失异常上下文。
所以现在你可以这样做:
void open_file(std::string const & file_name) {
try {
std::ifstream file;
file.exceptions(ios::failbit | ios::badbit);
file.open(file_name);
}
catch (...) {
std::rethrow_with_nested(std::logic_error("File " + file_name +
" could not be open"));
}
}
如果我没记错的话,你可以像这样得到回溯:
void print_backtrace(std::exception const & e, int depth = 0) {
std::cerr << std::string(depth, ' ') << e.what() << std::endl;
try {
std::rethrow_if_nested(e);
}
catch (std::exception const & ex) {
print_backtrace(ex, ++depth);
}
}
因此,如果您将print_backtrace 与open_file 一起使用,它应该在输出中为您提供std::logic_error + ios_base::failure。
我的问题是:
- 考虑到我想在不丢失上下文的情况下捕获所有异常,这个习惯用法是在 c++11 中处理异常的“正确”方式吗?
-
print_backtrace函数中是否有办法捕获异常,catch (...)可以完全捕获所有异常? - 我不知道为什么需要
std::rethrow_exception,也不知道什么时候需要。
【问题讨论】:
-
我对 C++11 知之甚少,但确实觉得很奇怪,您必须重新抛出才能获得嵌套异常。我希望他们能够提供一些检查嵌套异常的方法 不会抛出它们。通常异常代表异常流控制,但在
print_backtrace函数的上下文中,检查嵌套异常在概念上是正常流控制。 -
是的,我也觉得奇怪,其实我也不知道具体的设计,我只记得nested_exception是一个mixin类,你的异常是
nested_exception的父类。我还看到它有[[noreturn]] void rethrow_nested() const和exception_ptr nested_ptr() const noexcept。 -
@Kevin of 2013 - 在 C++ 中,异常适用于正常但异常的情况,例如分配数组的内存太少,或者用户输入了错误的文件名。它们旨在允许继续处理。在造成更多伤害之前,应通过尽可能优雅地终止程序来处理异常情况。
-
@JiveDadson 你对 abnormal 的定义比我的要强一些...我可能会更好地说 unusual vs 通常。
-
@Kevin - 我说的是我的意思,我的意思是我说的。 :-) 我在“不正常”的意义上使用异常,也就是说,偏离规范、规则或原则。(“弗兰肯斯蒂恩博士不知道,伊戈尔已经获得了一个异常的大脑。”)@987654321 @ 例外我的意思是需要不寻常的关注。 “活的语言”有问题。话被淡化了。有一个相对较新的例外用法已被编入词典,即作为“不正常”的同义词。呃。我发现保留这种区别很有用。
标签: c++ c++11 exception-handling