【发布时间】:2016-12-22 15:49:40
【问题描述】:
我在我的程序组件中设计异常类的层次结构时遇到了麻烦。
在这个组件中有几个失败案例(例如,属于std::bad_alloc、std::invalid_argument、std::system_error 等...),对于每个非常具体的失败案例,我都创建了相应的异常类,源自以上一般异常类别。
现在,我被要求将我的所有异常类都派生自一个类,比如Base,这样我的客户就可以通过简单地捕获Base 来知道故障是否来自我的组件。但是,我的组件的另一个客户对异常发生的位置不感兴趣,但对异常发生的原因不感兴趣。因此,我的异常类似乎必须同时派生自通用标准异常类以及单个可区分的基类Base。
我的问题是:我应该让Base 派生自std::exception 吗?
如果它是从 std::exception 派生的,那么每个异常类内部必须有两个 std::exception 实例,因为标准异常类似乎没有使用虚拟继承。我认为在这种情况下,对于每个异常类,我都必须将转换运算符写入std::exception,这似乎很乏味。
如果它不是从 std::exception 派生的,那么只想捕获Base 的客户端不能使用 std::exception 的能力,例如,what(),除非我在基内实现它们班级。如果是这样的话,所有的异常类本质上都为一个能力有两个名称,这似乎很荒谬。此外,如果客户端希望将其重新抛出给期望从std::exception 派生的异常类的其他人,客户端必须进行某种形式的重新打包,这是非常不可取的。
我该怎么办?
编辑: 第二个客户的要求是他/她想使用标准的异常类而不是我做的,因为他/她使用的组件非常多,同时抛出了太多种类的异常,所以他/她只是无法知道所有的失败案例。
【问题讨论】:
标签: c++ exception multiple-inheritance