所以我遇到了这个(恕我直言)非常好的想法,使用返回值和异常的复合结构 - Expected<T>.它克服了传统错误处理方法(例外,错误代码)的许多缺点.
见安德烈Alexandrescu的的谈话(系统误差在C++处理)和它的幻灯片.
异常和错误代码具有基本相同的使用方案,其中函数返回某些内容而不返回内容.Expected<T>另一方面,似乎只针对返回值的函数.
所以,我的问题是:
Expected<T>在实践中尝试过?更新:
我想我应该澄清一下我的问题.在Expected<void>专业化是有道理的,但我更感兴趣的是它如何被使用-在一致的使用成语.实现本身是次要的(并且很容易).
例如,Alexandrescu给出了这个例子(有点编辑):
string s = readline();
auto x = parseInt(s).get(); // throw on error
auto y = parseInt(s); // won’t throw
if (!y.valid()) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这段代码以一种自然流动的方式"干净".我们需要价值 - 我们得到它.但是,expected<void>有人必须捕获返回的变量并对其执行某些操作(如.throwIfError()或类似的东西),这不是那么优雅.显然,.get()无效是没有道理的.
那么,如果你有另一个函数,比如说toUpper(s),哪个函数就地修改了字符串并没有返回值,你的代码会是什么样子?