所以,我正在查看try/catch块的C++参考.
我看到有几种方法可以捕获异常,如下所示:
try {
f();
} catch (const std::overflow_error& e) {
// this executes if f() throws std::overflow_error (same type rule)
} catch (const std::runtime_error& e) {
// this executes if f() throws std::underflow_error (base class rule)
} catch (const std::exception& e) {
// this executes if f() throws std::logic_error (base class rule)
} catch (...) {
// this executes if f() throws std::string or int or any other unrelated type
}
Run Code Online (Sandbox Code Playgroud)
我在以下示例中看到您可以捕获"e"数据,如下所示:
std::cout << e.what();
Run Code Online (Sandbox Code Playgroud)
所以我的问题归结为:
如何获取异常数据catch(...)?
(附带问题:使用它是否明智catch(...)?)
一般来说,你不能.C++几乎可以抛出任何东西.例如,throw 42;是完全定义良好的C++代码,而异常的类型是int.
至于使用它是明智的 - 有效用途:
std::terminate则会调用它并且无法保证堆栈展开.catch(...)保证(因为它捕获任何异常).
int main()
{
super_important_resource r;
may_throw();
// r's destructor is *not* guaranteed to execute if an exception is thrown
}
Run Code Online (Sandbox Code Playgroud)
int main()
try {
super_important_resource r;
may_throw();
// r's destructor is guaranteed to execute during stack unwinding
} catch(...) {
}
Run Code Online (Sandbox Code Playgroud)
try {
//...
} catch(...) {
log() << "Unknown exception!";
throw;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
448 次 |
| 最近记录: |