如何从C ++函数返回多个错误代码

时间:2009-06-01 21:38:11

标签: c++

从C ++函数返回成功或一个或多个错误代码的好方法是什么?

我有这个名为save()的成员函数,它保存到每个成员变量中,至少有十个这些成员变量被保存到,对于save()的调用,我想找出来如果调用失败,如果是,则在哪个成员变量上(有些是硬故障,有些是软的)。

9 个答案:

答案 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可能会导致代码具有更少的错误,开发成本更低,并且产品上市时间更快。