什么是从C++函数返回成功或一个或多个错误代码的好方法?
我有一个名为save()的成员函数,它将每个成员变量保存到其中,至少有十个这样的成员变量需要保存,对于调用save()函数,我想知道调用是否失败,如果失败,则在哪个成员变量上(有些是硬性失败,有些是软性失败)。
什么是从C++函数返回成功或一个或多个错误代码的好方法?
我有一个名为save()的成员函数,它将每个成员变量保存到其中,至少有十个这样的成员变量需要保存,对于调用save()函数,我想知道调用是否失败,如果失败,则在哪个成员变量上(有些是硬性失败,有些是软性失败)。
我通常使用 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;
如果您的意图纯粹是返回错误状态,我建议使用bitset。
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.
}
bool function(int& error1, int& error2, stringx& errorText, int& error3);
我可能会首先尝试抛出异常,但这取决于你的编程范式。请参考一些关于为什么C++异常处理可能更好的书籍或文章。
如果我确实需要坚持返回错误代码的风格,我将使用位操作定义一个枚举类型来指定错误。
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...
}
}
这只是一个简单的例子。最好将其放入类中或使用命名空间。
您可以使用整数和位运算(也称为标志)。
我不熟悉您的项目内部和限制,但如果可能的话,请尝试使用异常而不是错误代码。
原因在这里,在C++ FAQ lite中列出,并得出以下结论:
因此,与通过返回代码和if进行错误报告相比,使用try / catch / throw很可能会导致具有更少错误、开发成本更低且上市时间更快的代码。