两种反模式在大多数代码库中非常常见,我已经使用布尔返回值来指示成功/失败,以及通用的整型返回码来指示有关错误消息的更多详细信息。如何在C++中设计异常“类型”?
这两者都非常类似C,并且在我的愚见中不太适合C++。
我的问题是关于最佳实践,当涉及到设计异常到您的代码库。换句话说,指出失败的有限可能性的最佳方式是什么?例如,前面提到的反模式之一通常会有一个巨大的枚举,每个枚举值代表一种特定类型的故障,例如FILE_DOES_NOT_EXIST
或NO_PERMISSIONS
。通常情况下,它们尽可能保持一般,以便可以跨多个不相关的域(如网络组件和文件IO组件)使用它们。
与此类似的设计,人们可能会考虑异常的设计是从std::exception
中为每种类型的失败或可能出错的事物子类化一个具体异常类型。所以在我前面的例子中,我们有以下几点:
namespace exceptions {
class file_does_not_exist : public std::exception {};
class no_permissions : public std::exception {};
}
我觉得这是更接近的东西,“感觉更好”,但最终这似乎只是一个维护的噩梦,特别是如果你有上百这些“错误代码”可以翻译成类。
我见过的另一种方法是简单地使用标准的<stdexcept>
类,例如std::runtime_error
,并有一个具有特定字符串。例如:
throw std::runtime_error("file does not exist");
throw std::runtime_error("no permissions");
这样的设计更容易维护,但让人难以或不可行有条件地赶上这些异常应该他们都将有可能从相同的核心位置或函数调用抛出。
那么什么是一个好的,可维护的异常类型设计?我的要求很简单。我想要了解发生了什么情况的上下文信息(是否内存不足?我缺少文件系统权限吗?我没有满足函数调用的前提条件(例如错误的参数)吗?),我也想以便能够相应地处理这些信息。也许我对待他们都是一样的,也许我有特定的失败声明,所以我可以从他们不同的方式恢复。
我对这个问题的研究才使我这样一个问题: c++ Exception Class Design
用户在这里问,我是一个类似的问题,他在底部代码示例几乎是惹人喜爱,但他的基本异常类做不遵循开放/封闭的原则,所以这对我来说真的不起作用。
什么方面这个问题从链接的问题区分开来,除了与答案模糊的不适? – 2013-06-02 19:38:37