可选的错误处理

时间:2011-03-15 02:17:45

标签: c++ error-handling overloading

我有一个如下所示的create方法,其中我想(如果返回是一个空指针)从中获取错误。但是我希望这个错误处理是可选的,而不是调用函数的要求。

代码:

class foo {
    foo() {...};
public:
    ~foo();
    static foo* createFoo(int aparam = 42, int bparam = 10, int& error = ?) {
        afoo* = new foo();
        if (!afoo) {
            error = 11;
            return 0; //NULL
        }
        ...
        return afoo;
    }

}

所以我可以决定使用:

foo* myfoo = createFoo(42);
if (!myfoo) { ... }

或者

int errorcode = 0;
foo* myfoo = createFoo(42, 10, errorcode);
...

此时(在我的实际代码中),我只是使用空指针(而不是ref)并在给出错误之前在createFoo代码中确定其有效性。

我对这种情况的最佳做法感兴趣。

2 个答案:

答案 0 :(得分:1)

当您通过引用传递某些内容时,您告诉该函数的用户这是必需参数。如果要使错误代码可选,请传入指向int的指针并将其默认值设置为null。

static foo* createFoo(int aparam = 42, int bparam = 10, int* error = NULL)

答案 1 :(得分:1)

我不知道我可以提供最佳实践,但这是我的观点。

检查NULL(失败的分配)是C和C ++中的标准做法,它是一个易于理解且易于识别的习惯用法。添加可选的错误代码,同时提供灵活性也增加了可能不需要的复杂性。它会使调用者负担决定是否使用该参数。

为什么他们会使用参数,除非他们认为该位置可能失败?怎么会

如果您认为错误代码很重要。我会建议备用签名,你总是检查返回码,不要检查返回指针的值:

// Returns error code.
static int createFoo(int, int, Foo **);

这可能是一个不太方便的功能,但会向正确的方向轻推调用者(用户)。

或者,您可以使用异常,既可以确保抛出std :: bad_alloc,也可以使用相应的错误代码抛出您自己创建的异常。这似乎是最干净的签名:

struct fooException { int error; }

// Throws fooException if cannot create foo.
static foo * createFoo(int, int);

我所追求的理念是:尽量减少复杂性。在这种情况下,删除似乎是一个无关的选项。 错误代码是重要的,应该始终,或者它是无关紧要的,并且将始终被忽略。