c++ - 为什么 C++ 允许抛出任何东西?

标签 c++ exception-handling

我刚看到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/

相关文章:

ruby - 如何检测API错误?

grails - 为什么我不能捕获 Groovy 的 MissingMethodException?

C++ offsetof char* 算法

c++ - 如何使用 static_assert 检查函数签名是否正确

c# - Web API 2 OData错误消息作为XML返回

c++ - 错误处理 : return value vs exception in C++

actionscript-3 - 如何在加载的 SWF 的 global$init 中捕获和异常?

c++ - FindFirstFile、FindNextFile API 是否不可靠?

c++ - 如何在类声明之外定义嵌套模板类的方法?

c++ - constexpr 表达式必须由 C++ 中的 lambda 捕获吗?