提问人:einpoklum 提问时间:9/25/2023 更新时间:10/17/2023 访问量:44
如何处理不符合预期错误类型的异常?
What to do about exceptions which don't fit your Expected error type?
问:
假设我想使用 C++23 中提供的新 std::expected<T、E>
机制,并带有一个函数:
using E = /* domain-specific error type regarding getting Foo's */
std::expected<Foo, E> getFoo(/* whatever */);
但是假设代码可能会因为我内存不足而引发异常,或者因为我查找一个不存在的键(我没有预料到并且无法与特定于域的内容相关)等抛出异常。getFoo()
std::unordered_map
我是否应该扩展我的类型以包括所有这些类型的异常?我是否应该将它们“包装”在一种类型的元素中(也许使用子类型)?我是否应该让这些异常像往常一样传播,并只保留特定于域的错误?E
E
E
上述行动方案中只有一种是惯用的,还是取决于具体情况?您能建议一些处理这种情况的经验法则吗?
答:
2赞
Nicol Bolas
9/25/2023
#1
您询问的是两种不同的情况:内存不足错误和其他情况。
当涉及到 OOM 时,唯一真正的问题是:你是否希望这种情况对你的应用程序来说是可行的?对于大多数程序,答案是否定的。因此,让异常到达或任何地方是合理的。main
当涉及到其他例外情况时,这些是您可以选择的事情。您可能无法将“不存在的密钥”异常转换为域错误,但您可以选择是否使用引发此类异常的 API。或者你可以选择不这样做。同样,这是一个你是否希望这是一种可生存条件的问题。
例如,如果用户给了你一个你期望存在于映射中的字符串,但它不存在,那么它就存在于他们身上,向他们公开该错误应该是你的错误集的一部分。但是,如果这种情况代表了您的内部编程错误,那么终止是有道理的。
这不是你可以理论化的那种事情。您必须将其应用于每个应用程序和用例的特定情况。
评论