c++ - 可选错误处理

标签 c++ error-handling overloading

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

代码:

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/

相关文章:

.net - 如何获取导致 ASP .NET 错误的请求数据

ios - 在对象初始化时为错误的参数值Objective-C引发错误

c# - 使 C# webmethod 的参数可选的最佳方法

c++ - 根据参数在 C++ 中重载运算符 "+"

c++ - 为 boost::graph::copy_graph 提供顶点映射参数

C++ Qt : Check the current State of QStateMachine

javascript - 尝试/捕获不捕获快速异步功能中的所有错误?

c++ - C++ 中的覆盖和重载是怎么回事?

c++ - 在从麦克风捕获期间耳机中的音量降低到 30%

c++ - 两个标准类型的两个模板函数