std::uncaught_exceptions
STD:不透光[医]例外,STD::未明[医]例外
Defined in header | | |
---|---|---|
bool uncaught_exception( | (1) | (deprecated in C++17) |
int uncaught_exceptions( | (2) | (since C++17) |
1%29检测当前线程是否有活动异常对象,即异常已抛出或重新抛出,并且尚未输入匹配的CATCH子句,std::terminate
或std::unexpected
换句话说,std::uncaught_exception
检测堆栈展开是否正在进行中。
2%29检测当前线程中有多少异常已被抛出或重新抛出,但尚未输入它们的匹配CATCH子句。
有时即使在std::uncaught_exception
()
==
true
例如,如果堆栈展开导致堆栈分配的对象被解构,则该对象的析构函数可以运行代码,只要异常在转义析构函数之前被某些CATCH块捕获,就会抛出异常。
参数
%280%29
返回值
1%29true
如果堆栈展开正在此线程中进行。
2%29当前线程中的未命名异常对象的数量。
例外
(none) | (until C++11) |
---|---|
noexcept specification: noexcept | (since C++11) |
注记
一个int返回的示例uncaught_exceptions被使用的是bost.log图书馆:表达BOOST_LOG(logger) << foo(首先,创建一个守护对象,并在构造函数中记录未识别异常的数量。输出由保护对象%27s析构函数执行,除非foo%28%29抛出%28,在这种情况下,析构函数中的未捕获异常数大于构造函数观察到的%29。
例
二次
#include <iostream>
#include <exception>
#include <stdexcept>
struct Foo {
~Foo() {
if (std::uncaught_exception()) {
std::cout << "~Foo() called during stack unwinding\n";
} else {
std::cout << "~Foo() called normally\n";
}
}
};
int main()
{
Foo f;
try {
Foo f;
std::cout << "Exception thrown\n";
throw std::runtime_error("test exception"
} catch (const std::exception& e) {
std::cout << "Exception caught: " << e.what() << '\n';
}
}
二次
产出:
二次
Exception thrown
~Foo() called during stack unwinding
Exception caught: test exception
~Foo() called normally
二次
另见
terminate | function called when exception handling fails (function) |
---|---|
exception_ptr (C++11) | shared pointer type for handling exception objects (typedef) |
current_exception (C++11) | captures the current exception in a std::exception_ptr (function) |
外部链接
- 理由
std::uncaught_exceptions
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。