【发布时间】:2012-01-24 16:12:51
【问题描述】:
在我的编程经验的这一点上,我意识到我是多么被宠坏了,在当今使用的大多数语言(C++、.Net、Java 等)中都可以使用异常处理,至少与 C 相比是这样。我准备好了参加高级 C 课程,并与我目前的范式相比,让我真正思考这些术语。
在 C 中,首先由程序员来防止错误发生,这对于习惯于异常处理的任何人来说都是相当令人生畏的。我突然想到,我遇到的任何具有异常处理的语言都恰好是面向对象的。至少据我所知,第一个具有异常处理功能的面向对象语言是 C++,它是 C 的一种演变。(如果我错了,请纠正我)
话虽如此,语言的面向对象特性是否允许异常处理,或者当面向对象语言真正开始变得司空见惯时,异常处理是作为一种特性添加的吗?什么是 C 缺少可以说的,C++,在机器代码中使 excpetion 起作用?
我发现这个post 是关于异常处理如何在后台工作的,但不确定该信息如何适用于我的问题(即,C 是否缺少通知、延续等?)。提前致谢。
【问题讨论】:
-
有关异常处理的维基百科条目 (en.wikipedia.org/wiki/Exception_handling) 是了解此主题的良好起点。
-
这些都不存在,只有 C 存在。异常处理只是一种抽象。 PS:你知道setjmp/longjmp吗?
-
我认为你的前提有点缺陷。标准 ML(根据大多数定义)具有异常处理,但没有(根据大多数定义)OOP;同样是 Ada 95 之前的 Ada。你用过多少种非面向对象的语言?
-
@MooingDuck -- OO 语言不会“允许”堆栈展开,就像土豆允许烹饪一样。大多数 OO 语言出于某种原因需要堆栈展开,这有助于实现 EH。但是堆栈展开功能(即,检查调用堆栈和识别单个过程边界的能力)是语言支持环境的一个功能,可能由于其他原因(例如调试、支持过程范围等)而存在。
-
@HotLicks:我喜欢土豆的比喻。更一般地说,OO 语言不需要堆栈展开来处理异常。 任何 语言具有任何类型的控制流都需要continuation——“我接下来要做什么”数据结构——能够进行检查和更改。在许多 OO 语言中,数据结构恰好是一个堆栈,因此异常处理需要检查堆栈。但是 OO 语言并没有要求使用堆栈来具体化延续! OO 语言可以是无堆栈的。
标签: c++ c exception-handling