c中的库错误管理:不同的方法

时间:2015-02-05 14:03:13

标签: c dll error-handling

我第一次开发出足够严肃的东西,所以我必须管理错误。我有三种方法可以使用:

COMDS_RETURN some_function(....)

这种方法的问题在于,有时候更容易返回指向“数据”的指针,例如指向链表的指针,但是如果函数失败,我就不知道它失败的原因。 / p>

我的第二种方法是始终附加一个'错误'参数:

pointer_to_data *some_function(...., error *myerror)

但是在这里我将总是在每个函数中添加额外参数的开销,并且对于某些函数,返回错误更好,就像在第一种方法中一样。

好吧,第三种方法是在两种第一种方法之间进行混合,但问题再次出现的问题是该库不具有统一的调用/错误检查模型。对于一个函数,你必须以第一种方式进行,对于另一个函数,你必须以第二种方式进行。

我想知道三者(或另一个存在的)之间的最佳方法是什么。

1 个答案:

答案 0 :(得分:1)

请注意,没有“最佳”方式;这取决于你的用例,每种方法都有其优点和缺点。

例如,COM对象通常返回HRESULT状态值。如果他们需要将数据返回给用户,他们会为指向要写入的数据的指针添加一个额外的参数。这样做的好处是能够检查与呼叫内联的状态,即

if (FAILED(d3dDevice->CreateBuffer(...)) {
    // handle failure...
}

C库中的许多函数都有一个特殊的返回值来指示失败。然后,用户可以引用errno以获取有关错误的更多信息。这样做的好处是不必事先声明数据变量并将它们作为额外的参数传递。