gpt4 book ai didi

c++ - 我想捕获一个异常并将其捆绑在我自己的异常中并向上抛出

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:14 24 4
gpt4 key购买 nike

我有一个管理资源的类。它需要一个 Loader 类,该类可以从路径中检索资源。 Loader 是一个抽象基类,因此任何人都可以创建新的加载器。

如果请求的资源不在缓存中,资源管理器将从加载器请求它。如果加载器失败,资源管理器会抛出一个我创建的名为 LoadingError 的异常类。

我希望 Loader 类在失败时抛出异常。如有必要,我可以要求它们继承我自己的异常基类。

问题是,当抛出 LoadingError 时,我希望它包含有关失败原因的具体信息。但是具体Loader可能会抛出什么异常我就不清楚了。 (用户可能会在资源管理器周围的 catch block 中)。

要么我可以只抛出带有一些一般信息的 LoadingError,要么允许来自 Loader 的特定异常出现而不触及它。但我想捕获异常并将其捆绑在我自己的 LoadingError 异常中,或者在 LoadingError 中指向它。但是我不知道指向的异常会持续多久(担心坏指针)。

我应该做这三个中的哪一个? (以及如何,对于第三个......)

谢谢

最佳答案

嵌套异常怎么样?

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 提供了整个逻辑。 .

关于c++ - 我想捕获一个异常并将其捆绑在我自己的异常中并向上抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20915670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com