考虑以下 C++ 代码:
class MyException {};
void someFunction()
{
try
{
/// ... code that may throw
}
catch(std::exception& e )
{
throw MyException();
}
}
Question
异常 e 是在 catch 块的开头还是在 catch 块的末尾被吸收?
在第二种情况下,抛出新的异常将导致有两个正在运行的异常,这不是我想要的。我想吸收 std::Exception 并开始我自己的类型之一。
不,应该这样做。这throw myException()
仅当第一个异常已被捕获并因此不再“飞行中”时才会发生。
这种设计模式很常见,可以将来自代码所使用的另一个库的错误消息“翻译”为代码用户可以更好地关联的错误。
或者,如果您想做的不仅仅是throw
(假设您想要清理一些资源——尽管这实际上应该通过 RAII 完成,即从析构函数中完成),那么您可以简单地通过以下方式重新抛出原始异常
try
{
// ... code that may throw
}
catch(...) // catches anything
{
// ... code that runs before rethrowing
throw; // rethrows the original catch
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)