在catch块中抛出一个异常会导致两个异常在飞行中吗

Will throwing an exception in a catch block lead to two exceptions being in flight?

本文关键字:异常 两个 飞行 catch 一个      更新时间:2023-10-16

考虑以下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)被抛出到更高的上下文。所以,再次没有战斗:)