0

我已经搜索过这个主题,但找不到相关的答案......

假设我有一个像这样声明的抽象类:

class Abstract{

    virtual Interface* createHandle() = 0;

    virtual ~Abstract() = 0;
};

基本上,一个抽象类提供了一个独特的函数,该函数返回类接口的任何实现(也是一个抽象类)。

我想知道这种设计如何处理错误。如果createHandle()遇到错误并且无法返回指向接口实现的指针,那么正确处理和通知此问题的最佳方法是什么?

我首先想到的是返回一个空指针,然后检查调用代码是否返回的指针为空。它会起作用,但我发现这设计得很糟糕,因为接口(即抽象)从不暗示 createHandle() 可以返回一个空指针,或者返回一个空指针来表示错误(我发现这个事实很糟糕只是留下评论说“如果错误应该返回null”)。

然后,我想到了在接口指针中携带这些信息。也就是说,将两个公共非虚拟函数添加到设置/获取某种错误代码的类中。但我根本不喜欢它,因为它与 Interface 类无关,而是与createHandle()Interface 不知道的实现有关(即有一个成员变量存储与使用代码相关的错误该类的代码相关的错误,感觉我认为非常错误,尽管我可能是错的)。

那么我想知道,指定该函数在发生错误时的行为方式是一种优雅的方式(以完全独立于任何实现的方式,实际上恰恰相反:强制实现以它的方式处理错误)指定的)。

4

3 回答 3

3

如果情况异常且必须处理,则可以抛出exception异常(尽管您不能强制执行此操作,但至少将情况标记为异常)。否则返回nullptr是完全可以的。

例如,如果您想读取可能不存在的文件 - 这不是程序错误,而是预期的情况,因此返回nullptrFileReader 是有意义的。

还要表明这nullptr是一个有效的想法并强制检查您可能会返回boost::Optional或您自己的可选类,其中也可能包含错误代码。

于 2013-05-14T13:57:18.797 回答
2

如果您打开了异常,则可以选择异常。

于 2013-05-14T13:57:44.593 回答
1

您可以选择抛出异常或返回 nullptr,但不能同时选择两者。

我建议抛出异常,因为它告诉调用者问题的确切原因,而 null 是沉默的。

于 2013-05-14T14:05:10.003 回答