我正在使用错误代码来处理我的c ++项目中的错误.问题是如何从一个应该返回一些变量/对象的函数返回错误代码.
考虑一下:
long val = myobject.doSomething();
Run Code Online (Sandbox Code Playgroud)
在这里,myobject是某个类的对象.如果doSomething函数遇到某些错误条件,那么它应该如何通知调用者(不使用异常).
可能的解决方案:
现在如何通知调用者一些错误情况?
JUS*_*ION 28
例如,创建一个模板,称Maybe它由您的返回值类型进行参数化.每当您返回一个值时,将其包装在此模板中,如下所示:
Maybe<long> result = object.somemethod();
Run Code Online (Sandbox Code Playgroud)
该Maybe模板将有一个错误代码(可能是一个静态方法)实例化的方式:
return Maybe<long>::error(code);
Run Code Online (Sandbox Code Playgroud)
但通常会返回值:
Maybe<long> retval;
retval = 15;
return retval;
Run Code Online (Sandbox Code Playgroud)
(当然,您必须覆盖适当的构造函数,赋值运算符等)
在客户端,您调用方法来检查错误.
Maybe<long> result = object.somemethod();
if (result.is_error)
{
... handle the error ...
}
else
{
... use the result ...
}
Run Code Online (Sandbox Code Playgroud)
同样,您需要定义适当的运算符,以便Maybe<long>在需要的地方使用long.
这听起来像很多工作,但实际上这项工作只需要制作一个好的防弹Maybe模板.您还必须对其进行一些性能调整,以避免令人讨厌的开销.如果要使其更加灵活,可以在返回值类型和错误类型上对其进行参数化.(这只是复杂性的微小增加.)
您可以将变量作为引用传递并在其中返回错误代码.
我看到有很多不错的解决方案,但如果我遇到这种情况,我会以另一种方式处理它。
auto doSomething()
{
// calculations
return std::make_pair(error_code, value)
}
int main()
{
auto result = doSomething();
if (!result.first)
{
std::cout << result.second;
}
else
{
std::cout << "Something went wrong: " << result.second;
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这是一个比传递 bool 作为参考更干净的解决方案。auto从c++14开始支持返回类型推导