错误处理设计的C ++ API

我写VS 2010中其中出口几类从DLL Windows上的C ++ API。 我们刨去支持其他平台版本(MacOS和Linux)的。

我目前正在思考如何设计错误处理。 我不希望使用,因为(至少在Windows)跨越的DLL边界问题的异常。

我想出了以下三种设计为止。

设计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:

每个方法返回一个错误代码。 [出]参数应作为指针传递和[in]通过值或(常量)引用参数。

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设计和错误处理。 但我不想接受的答案使用该解决方案有或使用类似的boost ::元组的返回值。

--------------解决方案-------------

好了,无例外的约束使得问题...我不会质疑。

草率,这是最好的取决于你的API的细节:你倾向于返回值是否有​​空余定点的价值观,你是否要强制/鼓励开发人员更明确地准备和错误代码的应付或有更可选,隐式和/或简洁。 你也可以考虑您已经使用的其他库的做法,尤其是如果它不是一清二楚给调用者哪个库给定函数是。 由于没有单一的最好的一个尺寸适合所有人的答案,这个问题生存在C世界上这么多经过几十年(和C ++有例外)。

几个讨论点...

哨兵值(根据设计中的1指针)工作时,他们调用者的预期相当好(例如程序员往往会问自己“我能得到一个空指针?这一切意味着什么?”),直观的,一致的,最好,如果他们可以隐式转换器,布尔型,它们会产生真正的成功! 读取好多了,虽然很明显许多操作系统和标准C库函数失败返回-1,为0常常出现有意义的结果集内有效。

你已经隐含了解另一个需要考虑的:依靠国家函数调用你介绍线程和异步(信号处理)的安全问题之外。 您可以记录,开发商不应该从线程/异步代码限制其对象的使用,或者错误代码提供线程特定的存储,但它是痛苦的一个额外的维度。 返回或传递错误码对象避免了这个问题。 在错误码对象传递成为主叫方常数小的负担,但确实鼓励他们明确地思考错误处理。

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.619 (s). 10 q(s)