使用这种层次结构的目的是让用户有机会充分利用 C + + 异常处理机制的强大功能。因为‘ catch’子句可以捕获多态异常,所以用户可以编写‘ catch’子句来捕获异常层次结构的特定子树中的异常类型。例如,catch (std::runtime_error& e)将捕获来自 std::runtime_error子树的所有异常,允许所有其他异常通过(并进一步向上调用堆栈)。
P.S. 设计一个有用的异常类层次结构(它只允许在代码的每个点捕获您感兴趣的异常类型)是一项非常重要的任务。您在标准 C + + 库中看到的是该语言的作者提供的一种可能的方法。正如您所看到的,他们决定将所有异常类型划分为“运行时错误”和“逻辑错误”,并让您继续处理自己的异常类型。当然,还有其他方法可以构建这种层次结构,这种方法在您的设计中可能更合适。
更新: 可移植性 Linux VS Windows
正如 Loki Astari 和 unixman83在下面的回答和注释中所指出的,根据 C + + 标准,exception类的构造函数不接受任何参数。Microsoft C + + 有一个在 exception类中接受参数的构造函数,但这不是标准的。runtime_error类有一个在 Windows 和 Linux 平台上接受参数的构造函数(char*)。为了便于携带,最好使用 runtime_error。
(请记住,仅仅因为项目规范说代码不必在 Linux 上运行,并不意味着它永远不必在 Linux 上运行。)