如果发生错误,则返回错误值,否则,继续执行函数

Return error value if an error occurs, otherwise, continue with function

本文关键字:错误 否则 继续 函数 执行 如果 返回      更新时间:2023-10-16

有没有更好的(更具可读性和/或更少的重复代码(方法来用C++编写它?

int func()
{
int error = foo(); // can return true/false
if (error != 0) // if an error is returned from foo(), pass it up to the caller of func()
return error;
// otherwise, proceed
error = bar(); // can return true/false
if (error != 0)
return error;
return error; // all calls succeeded, return 0.
}

如果您只想返回 true(非零(或 false(零(的指示,而不是您调用的函数返回的实际值

int func()
{
return foo() || bar();
}

如果foo()bar()返回非零,这将返回1,并发生短路,因此如果foo()返回非零,则不会调用bar()。 在这种情况下,请考虑返回bool而不是int

如果foo()bar()可以返回一系列非零值(例如,指示不同的错误条件(,并且您需要保留这些值

int func()
{
int error = foo();
if (!error) error = bar();
return error;
}

你的版本看起来不错。我唯一要避免的是重用相同的变量,而是为每个错误使用一个单独的变量并严格限定其范围:

int func()
{
if (int const error = foo())
return error;
if (int const error = bar())
return error;
return 0;
}

是:

void func()
{
foo();
bar();
}

如果发生意外情况,任一函数都会向调用方引发异常。

错误代码是 C 主义。

如果你倾向于经常使用这种结构,我建议你定义一个monad来隐藏重复行为。一个简单的实现将是这样的。

实现

template<typename Return, Return True>
class Monad
{
Return _result;
public:
Monad() : _result(True) {}
public:
template<typename Function, typename... Args>
Monad&
call(Function f, Args ...args)
{
if (_result == True) {
_result = f(args...);
}
return *this;
}
Return result() { return _result; }
};

用法

bool f()      { std::cout << __PRETTY_FUNCTION__ << "n"; return true; }
bool g(int n) { std::cout << __PRETTY_FUNCTION__ << "n"; return n == 42; }
bool h()      { std::cout << __PRETTY_FUNCTION__ << "n"; return true; }
int main()
{
Monad<bool, true> m;
const bool result = m.call(f)
.call(g, 56)
.call(h)
.result();
std::cout << std::boolalpha << result << "n";
}

在这种情况下,仅调用f()g(56)(h()不调用(;result()返回false.

演示

你想要outcome<T>.

https://ned14.github.io/outcome/

但是为了节省一些击键,您将引入更大的编译时间。