我有一个管理资源的类。它需要一个可以从路径检索资源的 Loader 类。 Loader 是一个抽象基类,因此任何人都可以创建新的加载器。
如果请求的资源不在缓存中,则资源管理器将从加载器请求该资源。如果加载器失败,资源管理器会抛出一个我创建的名为 LoadingError 的异常类。
我希望 Loader 类在失败时抛出异常。如有必要,我可以要求它们从我自己的异常基类继承。
问题是,当抛出 LoadingError 时,我希望它包含有关失败原因的具体信息。但我不知道Loader到底会抛出什么异常。 (用户可能会在资源管理器周围的 catch 块中)。
我可以只抛出 LoadingError 和一些一般信息,或者允许来自 Loader 的特定异常出现而不碰它。但我想捕获异常并将其捆绑在我自己的 LoadingError 异常中,或者在 LoadingError 中指向它。但我不知道指向的异常会持续多久(担心坏指针)。
我应该做这三者中的哪一个? (以及如何,对于第三个..)
Thanks
嵌套异常怎么样?
try { /* ... */ }
catch (...)
{
throw MyException("An error occurred", std::current_exception());
}
只需创建一个合适的类来存储异常即可:
struct MyException : std::exception
{
std::string message;
std::exception_ptr nested_exception;
MyException(std::string m, std::exception_ptr e)
: message(std::move(m))
, nested_exception(std::move(e))
{ }
// ...
};
当异常被捕获时,捕获器可以重新抛出嵌套的异常:
try { /* load resource */ }
catch (MyException & e)
{
log("Resource loading failed: " + e.what());
std::rethrow_exception(e.nested_exception);
}
事实上,标准库已经通过以下方式提供了整个逻辑std::throw_with_nested.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)