【发布时间】:2013-02-02 02:51:12
【问题描述】:
所以我遇到了这个(恕我直言)非常好的想法,即使用返回值和异常的复合结构 - Expected<T>。它克服了传统错误处理方法(异常、错误代码)的许多缺点。
请参阅Andrei Alexandrescu's talk (Systematic Error Handling in C++) 和its slides。
异常和错误代码的使用场景基本相同,函数返回的和不返回的。另一方面,Expected<T> 似乎只针对返回值的函数。
所以,我的问题是:
- 你们有没有人在实践中尝试过
Expected<T>? - 如何将这个习惯用法应用于不返回任何内容的函数(即 void 函数)?
更新:
我想我应该澄清一下我的问题。 Expected<void> 专业化是有道理的,但我对它的使用方式更感兴趣——一致的使用习惯。实现本身是次要的(也很容易)。
例如,Alexandrescu 给出了这个例子(稍作修改):
string s = readline();
auto x = parseInt(s).get(); // throw on error
auto y = parseInt(s); // won’t throw
if (!y.valid()) {
// ...
}
这段代码是“干净的”,它只是自然流动。我们需要价值——我们得到它。但是,对于expected<void>,必须捕获返回的变量并对其执行一些操作(如.throwIfError() 或其他东西),这并不那么优雅。显然,.get() 对 void 没有意义。
那么,如果你有另一个函数,比如toUpper(s),它会就地修改字符串并且没有返回值,你的代码会是什么样子?
【问题讨论】:
-
有提议在std库中添加boost::optional:open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3406.html
-
为什么 .get() 对于 Expected
没有意义? Expected 应该是专门的并且 .get() 必须返回 void。 -
std::future
的行为方式相同。调用 get() 或 wait() 取决于用户,因为 Expected /std::future 传达的不仅仅是一个值。请注意,用户也可能忘记在 Expected /std::future 上调用 .get() 函数,甚至用户可能只想忽略它的值。 -
@Alex 抱歉,我搬家后忘记更改链接。这是the new link。
-
@berkus 很抱歉多次断开链接。这是当前的一个:github.com/adityaramesh/ccbase/blob/master/include/ccbase/error/…。此链接不会中断,因为我不会重命名 repo:github.com/adityaramesh/ccbase。此外,impl 现在支持引用。
标签: c++ c++11 error-handling runtime-error