我刚看到this question及其相关答案。
考虑到我以前从未遇到过这种使用 throw
的方式,我很惊讶地发现这甚至是可能的。
- 允许(几乎)任何东西被抛出和捕获背后的逻辑是什么?
- 是否使用了超越异常/错误信号的 throw-catch 语法?如果是这样,这是否被认为是不好的做法,或者是否存在我从未意识到的“常见”用法?
最佳答案
如果没有猜测,这很难回答,但 Bjarne 1998 年的论文 "An Overview of the C++ Programming Language"在描述异常处理时使用任意类型,并建议为方便/语义创建所述类型的层次结构。看起来他一开始并没有为这些中的任何一个考虑 exception
的“基类”。
拥有标准层次结构(基于 std::exception
)的概念可能是作为一种“添加”开始的,这是一种接近 Bjarne 建议使用异常的便捷方式,而不是每个人对异常的使用都应基于这些构建 block 。当代实践是从 std::exception
派生所有异常,这似乎是后来出现的。
如今,我想不出不这样做的充分理由,如果除了使用您代码的人可能期望顶级 catch (const std::exception&)
之外没有其他原因> 吸收任何有用的东西。不过,我也倾向于在 main
中放置一个 catch (...)
,以防万一。
更实际地说,如果不是这种情况,则必须有额外的规则来约束 throw
仅在类型从 std::exception 派生的表达式上“有效”
,这似乎没有任何现实世界的好处足以证明额外规则的合理性。不管你信不信,C++ 起源于“为什么我们没有某某规则”这个问题的极简主义,尽管显然它的膨胀似乎与此相矛盾经过这么多年。
我怀疑这与将 throw
用于非异常情况有什么关系,因为这一直被认为是不好的做法。 Bjarne 描述此功能的方式是:
Exceptions are used to transfer control from a place where an error is detected to some caller that hasexpressed interest in handling that kind of errors. Clearly, this is a mechanism that should be used only for errors that cannot be handled locally. [..] Exceptions can be used to make error handling more stylized and regular.
因此很明显,至少最初的设计意图(同样,这仍然是常识)是仅对异常/错误情况使用异常。
关于c++ - 为什么 C++ 允许抛出任何东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53629837/