我有一个创建方法,如下所示,我想(如果返回是一个空指针)从中获取错误。但是我希望这个错误处理是可选的,而不是调用函数的必要条件。
代码:
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 代码中确定它的有效性。
我的兴趣在于针对这种情况的最佳实践。
最佳答案
我不知道我能否提供最佳实践,但这是我的观点。
检查 NULL(分配失败)是 C 和 C++ 中的标准做法,这是一个很好理解和容易识别的习惯用法。添加一个可选的错误代码,在提供灵 active 的同时,也增加了可以说是不必要的复杂性。调用者需要决定是否使用该参数。
除非他们觉得在那个位置可能失败,否则他们为什么要使用该参数?怎么会
如果您觉得错误代码很重要。我会建议备用签名,您始终检查返回代码,而不检查返回指针的值:
// 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);
我的理念是:尽量减少复杂性。在这种情况下,通过删除似乎无关的选项。 错误代码要么很重要并且应该始终使用,要么是无关紧要的并且将始终被忽略。
关于c++ - 可选错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5306801/