4

考虑以下 C++ 代码:

class MyException {};

void someFunction()
{
    try
    {
        /// ... code that may throw
    }
    catch(std::exception& e )
    {
        throw MyException();
    }
}

问题

异常 e 是在 catch 块的开头还是在 catch 块的结尾被吸收?

在第二种情况下,抛出新异常会导致两个异常在运行,这不是我想要的。我想吸收 std::exception 并开始我自己的一种类型。

4

2 回答 2

3

不,这就是一个人应该这样做的方式。throw myException()仅当第一个异常已被捕获并因此不再“在飞行中”时才会发生。

这种设计模式非常常见,可以将来自您的代码正在使用的另一个库的错误消息“翻译”为您的代码用户可以更好地关联的错误。

或者,如果你想做的不仅仅是throw(比如你想做一些资源清理——尽管这应该通过 RAII 来完成,即从析构函数),那么你可以简单地通过重新抛出原始异常

try
{
    // ... code that may throw
}
catch(...) // catches anything
{
    // ... code that runs before rethrowing
    throw;    // rethrows the original catch
}
于 2015-11-13T08:41:18.573 回答
1

在 catch 块中, justthrow;语句足以在更高的上下文中重新抛出相同的异常。它再次抛出相同的异常。不会产生新的异常。所以没有战斗:)

如果你想捕获 A 类型的异常,然后抛出 B 类型的异常,那么你这样做的方式是绝对正确的。在这种情况下,旧异常(类型 A)被捕获(吸收),只有新异常(类型 B)被抛出到更高的上下文。所以,再次没有战斗:)

于 2015-11-13T08:56:15.980 回答