【问题标题】:library error management in c : different approachesc中的库错误管理:不同的方法
【发布时间】:2015-02-05 14:03:13
【问题描述】:

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

COMDS_RETURN some_function(....)

这种方法的问题在于,有时返回指向“数据”的指针(例如指向链表的指针)更容易,但在这里,如果函数失败,我无法知道其失败的原因。

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

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

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

好吧,第三种方法是在第一种方法之间混合使用,但这里的问题再次是库没有统一的调用/错误检查模型。对于一个函数,你必须以第一种方式执行,对于另一个函数,你必须以第二种方式执行。

我想知道这三种方法(或现有的另一种方法)之间的最佳方法是什么。

【问题讨论】:

    标签: c dll error-handling


    【解决方案1】:

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

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

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

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

    【讨论】:

    • errno 是线程安全的(至少对于 linux/unix/posix,不记得 C 标准是否规定了)。
    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2017-09-18
    相关资源
    最近更新 更多