这是一个相当普遍的API设计问题,而不是C ++相关的问题,无论如何,从预期返回类的实例的函数中通常接受的是:如果出现错误则返回NULL或返回该类的实例没有数据?
答案 0 :(得分:1)
一般情况下,我会返回NULL或throw。失败的代码需要尽早理解。
返回“损坏”对象的替代方法需要理解对象的每个函数都被破坏并处理它。
NULL / throw要求你为每个构造处理一个错误,如果失败则在你的脸上
答案 1 :(得分:1)
问自己这个问题:
"我的职能的承诺是什么,因此客户的期望是什么?
如果函数承诺返回一个对象,则抛出一个异常,如果它不能。一个例外表示无法履行承诺。
e.g:
T make_t(Arg arg); // promises to make a T, should throw if it can't
如果函数承诺可能返回一个对象,那么在界面中表达:
boost::optional<T> maybe_make_t(Arg arg);
在这种情况下,如果没有制作对象,我们就不会发生异常,只是空optional<T>
。因为我们已经返回了一个可选项,所以调用者必须在使用该值之前检查它(或者遇到异常)。他现在受到保护,免受他自己的逻辑错误。
如果可以避免,请尽量避免返回指针。它们会给您的来电者带来麻烦。
也许(出于某种原因)你想避免异常,但仍能安全地报告失败以保证承诺?
以这种方式:
boost::variant<T, std::string> make_t_or_reason_why_not(Arg arg);
现在你强迫调用者使用静态访问者来处理你的结果(这很好!它迫使他覆盖所有代码路径)。
承诺是将返回某些内容, 为T
或string
,解释为什么{{ 1}}没有制作。