gpt4 book ai didi

c++ - C++ API 的错误处理设计

转载 作者:IT老高 更新时间:2023-10-28 22:30:15 26 4
gpt4 key购买 nike

我正在使用 VS 2010 在 Windows 上编写 C++ API,它从 DLL 导出多个类。我们计划稍后支持其他平台(MacOS、Linux)。

我目前正在考虑如何设计错误处理。由于跨 DLL 边界的问题(至少在 Windows 中),我不想使用异常。

到目前为止,我想出了以下三个设计。

设计 1:

对于每个方法,返回值将通过分别返回 true/falsepointer/nullptr 来指示操作是成功还是失败。然后,客户端可能会调用 GetLastError() 来检索详细说明上次失败的错误代码(枚举)。

typedef std::shared_ptr<Object> ObjectPtr;

class APIClass
{
bool SetSomething(int i);
bool IsSomethingSet();
bool DoSomething();
ObjectPtr GetSomething();

ErrorCode GetLastError();
}

设计 2:

每个方法都返回一个错误代码。 [out] 参数应作为指针传递,[in] 参数应按值或 (const) 引用传递。

typedef std::shared_ptr<Object> ObjectPtr;

class APIClass
{
ErrorCode SetSomething(int i);
ErrorCode IsSomethingSet(bool* outAsk);
ErrorCode DoSomething();
ErrorCode GetSomething(ObjectPtr* outObj);
}

设计 3:

与设计 1 类似,但您可以将可选错误代码作为 [out] 参数传递给每个函数。

typedef std::shared_ptr<Object> ObjectPtr;

class APIClass
{
bool SetSomething(int i, ErrorCode* err = nullptr);
bool IsSomethingSet(ErrorCode* err = nullptr);
bool DoSomething(ErrorCode* err = nullptr);
ObjectPtr GetSomething(ErrorCode* err = nullptr);
}

我想让设计保持简单、一致和干净。作为客户,您更喜欢哪种设计?对于更好的设计,您还有其他建议吗?你能给出一些理由说明为什么一种设计更好,或者这只是一个品味问题?

注意:这里有一个类似的问题:C++ API design and error handling .但我不想在接受的答案中使用解决方案,也不想使用 boost::tuple 之类的东西作为返回值。

最佳答案

好的,所以无异常(exception)约束使成为问题......我不会质疑。

总而言之,这最好取决于您的 API 的具体情况:您倾向于返回的值是否具有备用标记值,您是否想强制/鼓励开发人员更明确地准备和处理错误代码,或者拥有它更可选、隐含和/或简洁。您可能还会考虑您已经在使用的其他库的做法,特别是如果调用者对于给定函数来自哪个库不是很明显的话。因为没有一个最好的万能答案,所以这个问题在 C 世界中存活了几十年(C++ 也有异常(exception))。

几个讨论点...

Sentinel 值(根据您在设计 1 中的指针)在调用者预期它们时工作得很好(例如,程序员倾向于问自己“我可以得到一个空指针吗?这意味着什么?”),直观,一致的,最好是如果它们可以隐式转换为 bool 值,那么它们会在成功时产生真值!这读起来要好得多,尽管显然许多 OS 和标准 C 库函数在失败时返回 -1,因为 0 在有意义的结果集中通常是有效的。

您已经隐含理解的另一个考虑因素:通过依赖函数调用之外的状态,您会引入线程和异步(信号处理)安全问题。您可以记录开发人员不应该限制他们对线程/异步代码的对象的使用,或者为错误代码提供线程特定的存储,但这是一个额外的痛苦维度。返回或传入 ErrorCode 对象可以避免该问题。传入 ErrorCode 对象对调用者来说是一个持续的小负担,但确实鼓励他们明确地考虑错误处理。

关于c++ - C++ API 的错误处理设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9323907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com