从C ++函数返回成功或一个或多个错误代码的好方法是什么?
我有这个名为save()的成员函数,它保存到每个成员变量中,至少有十个这些成员变量被保存到,对于save()的调用,我想找出来如果调用失败,如果是,则在哪个成员变量上(有些是硬故障,有些是软的)。
答案 0 :(得分:7)
您可以返回具有多个错误字段的对象,也可以使用“out”参数。
如何执行此操作取决于您的设计以及您要返回的确切内容。常见的情况是,您需要报告状态代码以及各种消息。有时会在函数返回状态代码作为返回值的情况下执行此操作,然后通过“out”参数返回消息状态。
如果你只是返回一组'代码',那么构造一个struct类型并返回它会更有意义。在这种情况下,我倾向于将其作为out参数传递,并让方法在内部更新它,而不是每次都分配一个新的。
你打算一次或多次这样做吗?
答案 1 :(得分:7)
我知道这并没有真正回答你的问题,但是......
在C ++中,您应该使用异常而不是返回错误代码。错误代码最常用于库,它们不希望强制库用户使用特定的错误处理约定,但在C ++中,我们已经有了stdexcept。当然,可能有理由不使用异常,例如编写嵌入式代码或内核扩展时。
答案 2 :(得分:6)
我通常使用boost::tuple
:
typedef boost::tuple<int,int> return_value;
return_value r = my_function();
int first_value = boost::get<0>( r );
int second_valud = boost::get<1>( r );
修改
您还可以使用boost::tie
从元组中提取值:
boost::tie( first_value, second_value ) = r;
答案 3 :(得分:4)
返回两个值的最简单方法是使用std :: pair&lt;&gt;模板:
答案 4 :(得分:2)
您需要将它们作为输出参数返回:
bool function(int& error1, int& error2, stringx& errorText, int& error3);
答案 5 :(得分:2)
如果您打算纯粹返回错误状态,我会使用bitset。 e.g。
const bitset<10> a_not_set(1);
const bitset<10> b_not_set(2);
const bitset<10> c_not_set(4);
...
bitset<10> foo(T& a, T& b, T& c, ...)
{
bitset<10> error_code = 0;
...
if ( /* a can't be set */ )
{
error_code |= a_not_set;
}
...
if ( /* b can't be set */ )
{
error_code |= b_not_set;
}
...
// etc etc
return error_code;
}
bitset<10> err = foo(a, b, c, ... );
if (err && a_not_set)
{
// Blah.
}
答案 6 :(得分:2)
您可以使用带位操作的整数(也就是标志)。
答案 7 :(得分:2)
我可能首先尝试抛出异常,但这取决于您的编码范例。请查看一些有关c ++异常处理可能更好的原因的书籍或文章。
如果我真的需要坚持retrun-error-code风格,我会定义一个eunm类型来指定位操作的错误..
enum error
{
NO_ERROR = 0,
MEMBER_0_NOT_SAVED = 1,
MEMBER_1_NOT_SAVED = 1 << 1,
MEMBER_2_NOT_SAVED = 1 << 2,
// etc..
};
int save()
{
int ret = NO_ERROR;
// fail to save member_0
ret |= MEMBER_0_NOT_SAVED;
// fail to save member_1
ret |= MEMBER_1_NOT_SAVED;
// ....
return ret;
}
int main(void)
{
int ret = save();
if( ret == NO_ERROR)
{
// good.
}
else
{
if(ret & MEMBER_0_NOT_SAVED)
{
// do something
}
if(ret & MEMBER_1_NOT_SAVED)
{
// do something
}
// check the other errors...
}
}
这只是一个粗略的例子。最好将它放入类或使用命名空间。
答案 8 :(得分:0)
我不熟悉项目的内部和约束,但如果可能,请尝试使用异常而不是错误代码。
原因列于here, at C++ FAQ lite,最后是:
因此,与通过返回码进行错误报告相比,如果使用try / catch / throw可能会导致代码具有更少的错误,开发成本更低,并且产品上市时间更快。