在catch块中抛出一个异常会导致两个异常在飞行中吗
Will throwing an exception in a catch block lead to two exceptions being in flight?
考虑以下C++代码:
class MyException {};
void someFunction()
{
try
{
/// ... code that may throw
}
catch(std::exception& e )
{
throw MyException();
}
}
问题
异常e是在catch块开始时吸收的,还是在catch区块结束时吸收的?
在第二种情况下,抛出新的异常会导致有两个异常在运行,这不是我想要的。我想吸收std::异常并开始一个我自己类型的异常。
否。这就是应该做的。throw myException()
只有在第一个异常被捕获并因此不再"处于飞行状态"的情况下才会发生。
这种设计模式很常见,可以将来自代码使用的另一个库的错误消息"翻译"为代码用户可以更好地处理的错误。
或者,如果你想做的不仅仅是throw
(比如说你想做一些资源清理——尽管这确实应该通过RAII来完成,即从析构函数),那么你可以简单地通过重新抛出原始异常
try
{
// ... code that may throw
}
catch(...) // catches anything
{
// ... code that runs before rethrowing
throw; // rethrows the original catch
}
catch块中只有throw;
语句就足以在更高的上下文中重新引发相同的异常。它再次抛出SAME异常。没有生成新的异常。所以没有战斗:)
如果您想捕获类型A的异常,然后抛出类型B的异常,那么您这样做的方式是绝对正确的。在这种情况下,旧异常(类型A)被捕获(吸收),只有新异常(类型B)被抛出到更高的上下文。所以,再次没有战斗:)
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 基于对象的两个属性的自定义比较器会引发异常
- 是否可以同时有两个或多个活动异常
- 无法创建两个从 std::logic_error 继承的自定义异常类
- 具有两个类似catch部分的代码的异常处理行为
- 在catch块中抛出一个异常会导致两个异常在飞行中吗
- 当函数带两个异常退出时,原始异常发生了什么?
- c++标准是否允许添加两个整数(基本类型int)来抛出c++异常?
- 用C++中的两个文件流处理异常