在 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::exception 并开始我自己的类型之一。
没有。就应该这样做。 throw myException()
只有在捕获到第一个异常时才会发生,因此不再是 'in flight'.
这种设计模式对于来自您的代码正在使用的另一个库的错误消息非常常见 'translate',而您的代码的用户可以更好地理解错误。
或者,如果你想做的不仅仅是 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++ 代码:
class MyException {};
void someFunction()
{
try
{
/// ... code that may throw
}
catch(std::exception& e )
{
throw MyException();
}
}
问题
异常e是在catch块的开头还是在catch块的末尾被吸收?
在第二种情况下抛出新的异常会导致两个异常在运行中,这不是我想要的。我想吸收 std::exception 并开始我自己的类型之一。
没有。就应该这样做。 throw myException()
只有在捕获到第一个异常时才会发生,因此不再是 'in flight'.
这种设计模式对于来自您的代码正在使用的另一个库的错误消息非常常见 'translate',而您的代码的用户可以更好地理解错误。
或者,如果你想做的不仅仅是 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)被抛出到更高的上下文。所以,再一次没有战斗:)