是否可以同时有两个或多个活动异常
Is it possible to have two or more active exceptions at the same time?
>C++17引入了一个新函数std::uncaught_exceptions
:
检测已引发或重新引发但尚未引发的异常数 输入其匹配的捕获子句。
以下代码:
#include <iostream>
using namespace std;
struct A
{
~A()
{
cout << std::uncaught_exceptions() << endl;
}
};
int main()
{
try
{
try
{
A a1;
throw 1;
}
catch (...)
{
A a2;
throw;
}
}
catch (...)
{
A a3;
}
}
输出:
1
1
0
是否可以同时有两个或多个活动异常?
有没有例子?
是的。从析构函数中引发异常,该析构函数由于堆栈展开而从处理另一个异常中调用:
struct D
{
~D()
{
std::cout << std::uncaught_exceptions() << std::endl;
}
};
struct E
{
~E()
{
try
{
D d_;
throw 2;
}
catch(...)
{
std::cout << std::uncaught_exceptions() << std::endl;
}
}
};
int main()
{
try
{
D d;
E e;
throw 1;
}
catch(...)
{
}
}
d
的析构函数将在 1
仍然是一个活动的异常时被调用。所以~d
里面std::uncaught_exceptions()
将是 1。
对于e
,它的析构函数将被调用,而1
是一个活动的异常。将调用其析构函数。它将构造一个D
,然后再次抛出。但由于此时1
和2
都没有被抓住,~d_
内部的std::uncaught_exceptions()
将是2。
std::uncaught_exceptions
的全部目的是检测这种情况。它允许您知道对象是由于堆栈展开还是正常执行而被销毁。这让您知道是否应该执行不同类型的清理。考虑一个 RAII 对象,如果事务由于堆栈展开而被销毁,它将回滚事务。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 处理多个异常集合的C++方法
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 基于对象的两个属性的自定义比较器会引发异常
- 是否可以同时有两个或多个活动异常
- 无法创建两个从 std::logic_error 继承的自定义异常类
- 具有两个类似catch部分的代码的异常处理行为
- 在catch块中抛出一个异常会导致两个异常在飞行中吗
- 当函数带两个异常退出时,原始异常发生了什么?
- c++标准是否允许添加两个整数(基本类型int)来抛出c++异常?
- 用C++中的两个文件流处理异常