在我的编程经验中,我意识到在今天使用的大多数语言(C++、.Net、Java等)中使用异常处理是多么的糟糕,至少与C相比是如此。我正准备参加一个高级C课程,并让我将这些术语与我目前的范式进行比较。
在C中,首先要由程序员来防止错误发生,这对于任何习惯于异常处理的人来说都是相当令人畏惧的。我曾经想到过,我遇到的任何语言都有异常处理,而这些语言恰好是面向对象的。至少据我所知,第一个具有异常处理的面向对象语言是C++,它是C的一种进化(如果我错了,请纠正我)。
尽管如此,是否对一种允许异常处理的语言的面向对象特性有什么看法,或者异常处理作为一种特性添加到面向对象语言中是否已经开始成为一种普遍现象?在机器代码中,为什么C缺少这样的说法,C++,使超负荷工作?
我找到了这个关于异常处理在幕后是如何工作的帖子,但不确定该信息如何适用于我的问题(即,C是否缺少通知、延续等?)。提前谢谢。
发布于 2011-12-20 10:09:40
C在机器代码中什么都不缺,异常处理在setjmp
和longjmp
的C中也很常见。
完全缺乏纯过程语言中的语言级特性的原因是,当不需要调用析构函数时,异常处理与setjmp
完全相同。异常处理以前在异国语言中已经出现过,但是从来没有流行过,因为它纯粹是语法上的糖。然而,一旦析构函数进入场景,堆栈展开变得必要,语言级别的支持就变得必要,异常处理作为语言的一部分得到了广泛的实现。
发布于 2011-12-20 10:56:06
异常处理需要面向对象的编程吗?
不是的。两者是完全分开的。您可以使用没有异常处理作为控制流基元的OO语言,也可以在非OO语言中进行异常处理。
维基百科很有帮助地指出,面向对象的编程是一种编程风格,它强调了encapsulation,抽象、消息传递、模块化、和继承的价值,以便实现低成本的代码重用和对大型团队实施的复杂软件项目的有效管理。
您不会在列表中看到“循环”或"if语句“或"goto”或“尝试捕获-最终抛出”,因为控制流原语与抽象、封装、消息传递、模块化、多态或继承无关,用于实现低成本的代码重用或大型团队对复杂软件项目的有效管理。
在使异常正常工作的机器代码中,C++是什么意思?
当然,现代硬件是以异常处理作为控制流原语来设计的。在现代硬件存在之前很久就设计了C,这将使在C中实现异常处理变得更加困难,因为C可以在所有运行C的硬件上高效地运行。
但是,没有什么可以阻止您或其他人设计一个新版本的C,它将异常处理作为一个控制流基元,但是没有C++的所有其他特性。
如果您对如何向支持延续的非OO语言添加异常处理这一主题感兴趣,请参阅我关于概述该主题的文章:
发布于 2011-12-20 10:08:08
话虽如此,语言的面向对象特性是否允许异常处理,或者作为面向对象语言的特性添加的异常处理是否真的开始成为一种常见的?
在90年代初,当我不得不学习Ada (学习CS)时,我第一次了解了例外情况。Ada有一种特殊类型的Exception
。当时,它不是一种面向对象的语言。(Ada95添加了一些面向对象的概念。)但是,我同意堆栈展开(即对分配的资源进行完全自动清理)是异常处理成功的一个重要特征。将析构函数与异常处理相结合是C++中异常成功的一个重要方面。
我似乎还记得Stroustrup提到Ada是C++中异常处理的主要影响因素。
https://stackoverflow.com/questions/8579836
复制