这个问题不是技术问题,而是历史问题。我今天才想到我还认为Java是使用异常处理的“第一”语言,直到我意识到我这样思考的原因可能是因为Java是第一种语言 I 遇到了使用它,但我没有历史数据来支持这个结论。如今,异常处理在所有现代语言中都很常见,所以我只是想知道:有人知道它何时首次被广泛使用?什么语言是第一个开始使用它?
答案 0 :(得分:29)
编程语言:原理和实践,第2版,作者Kenneth C. Louden(一本着名的编程语言教科书)指出,“异常处理是由20世纪60年代的PL / I语言开创的,在20世纪70年代,在CLU中取得了显着进步。然而,仅在20世纪80年代和90年代初期,设计问题才得到了很大的解决“(283)。
答案 1 :(得分:15)
异常处理甚至可以在编程语言之前回归;首先,它是一种用于捕获错误条件(导致执行暂停的条件)和可选地分支到子例程的硬件机制。
例如,VAX CPU可以检测何时访问了没有物理映射的虚拟地址,并调用从交换加载适当页面或暂停程序的子例程。该机制在现代处理器中基本相同(查找“转换后备缓冲区”)。所以从某种意义上说,第一种有例外的语言是汇编。
最早的结构化语言似乎是PL / I和CLU(见上面的Mipadi)。
答案 2 :(得分:10)
CLU在20世纪70年代早期进行了异常处理。
答案 3 :(得分:7)
在Java之前,C ++有例外。
答案 4 :(得分:4)
我记得在1984年使用Xerox的Mesa语言中的异常处理程序。这种语言在此之前就存在了。梅萨有一个有趣的例外模型。除了以正常方式传播和处理异常之外,处理程序还可以“恢复”异常,从而导致执行从“throw”语句返回。
答案 5 :(得分:3)
Algol 68的“transput”有“事件”处理,但它不够流畅,程序员可以扩展它。
ALGOL 68 标准在“标准传输”(stdio)中广泛使用事件例程来管理将数据读取(或写入)到文件或外部设备时出现的各种事件。内置的“on event”例程是:
1983年,正在接受提案,允许程序员定义自己的例外情况。 AFAIK联合国的IFIP没有接受这些提案。
然而,俄罗斯标准组织“GOST”确实标准化了Glasnost /Гласност结尾附近的异常处理标准"GOST 27975-88 Programming language ALGOL 68 extended - Язык программирования АЛГОЛ 68 расширенный"
GOST 27975-88使用了额外的关键字:MODULE,PUB,POSTLUDE,NEST,EGG,ON,EXCEPTION和RAISE。
以下是英国最初的提案:
AB49.1983-May:“关于ALGOL 68中异常处理的提案”,C. H. Lindsey - 页数:10 - 15
AB49.1983-May:“ALGOL 68的异常处理机制”,Martyn Thomas - 页数:16 - 17
它们看起来与python中实现的内容类似。
林赛的例子:
EXCEPTION singular = new exception ; # EXCEPTION la a new mode #
PROC gauss = ( REF [ , ] REAL a. REF [ ] REAL rhs ) VOID :
COMMENT a procedure to solve a set of simultaneous
equations COMMENT
BEGIN C the usual algorithm for gaussian elimination which, at some
point, may discover that a is singular C ;
IF C it makes this discovery C
THEN RAISE singular
FI;
C rest of algorithm CO
END;
例外bulitin:时间耗尽,空间耗尽,算术错误,边界错误,范围错误,无法传输,文件结束,字符错误,值错误和格式错误
马丁·托马斯的例子: BEGIN
on ( overflow , overflow handler ) ;
on ( bound check, boundcheckhandler ) ;
C body of the closed - clause C
EXIT
overflow handler:
C handle overflow exceptions C
EXIT
bound check handler:
C handle bound check C
END
BTW:苏联的航天飞机Buran/Буран于1988年完成了一次无人太空飞行,自动着陆系统是用Algol编写的。 Amercian仍然在Jovial(Algol 58)中部署了大量的军事/太空装置,而这个可能包含了20世纪50年代的异常处理。有人对此有任何想法吗?...
维基百科:Buran_(spacecraft):航天飞机在206分钟的飞行中绕地球飞行两次。它在Baikonur Cosmodrome的航天飞机跑道上进行了自动着陆,尽管横向风速为61.2公里(38.0英里)/小时,但它横向降落仅3米(9.8英尺),纵向降落10米(33英尺)。来自目标。
答案 6 :(得分:1)
关于COBOL对异常处理的支持:经典(I / O和算术)异常处理至少从1968年的COBOL标准开始。在2002标准中,OO异常处理被添加到COBOL中。
答案 7 :(得分:0)
我们不应该忘记1970年代有setjmp(3)
和longjmp(3)
的C.
在此之前,Basic,on error goto...
我从未见过algol68的实现,但我听说它有厨房水槽......
答案 8 :(得分:0)
1962年参考手册中描述的Lisp 1.5中的errorset
函数是异常处理的早期形式。在 Lisp的演变中,Gabriel和Steele发表了这些评论,显然使运算符的名称略有错误并简化了其语法(第9-10页):
在Lisp 1.5中,如果给定不正确的参数,某些内置函数可能会发出错误信号,例如 例。发出错误信号通常会导致程序终止或调试器的调用。 Lisp 1.5也具有功能 错误集 ,对于受控执行代码 威力 导致错误。特殊形式
(errset form)
评估 形成 在错误不会终止程序或进入调试器的情况下。 如果 形成 不会引起错误, 错误集 返回值的单例列表。如果执行 形成 确实会导致错误, 错误集 形式悄悄地返回 零
MacLisp添加了功能 呃 ,表示出现错误。如果 呃 在动态内调用 一个上下文 错误集 形式,然后将参数 呃 返回为的值 错误集 表格。
程序员很快开始使用 错误集 和 呃 不是捕获错误并发信号,而是更多 一般控制目的(动态非本地出口)。不幸的是,这种使用 错误集 也悄悄地 捕获意外错误,使程序难以调试。一对新的原语, 抓住 和 扔 于1972年6月引入MacLisp,因此 错误集 可以保留其预期用途 使用错误陷阱。
manual当然在第34页的“ 6.4缺点计数器和错误集”一节中有详细信息。
看起来errorset
与内存分配监视程序“ cons计数器”交互。 errorset
的用户必须指定一个整数值n
,该整数值指定在陷阱发生之前可以在受保护的计算中分配多少个cons单元。
描述以以下单词结尾:
如果 一个 错误 发生 内 的 一个 错误集 然后 的 值 的 错误集 是 零。 如果是 能 界 外 的 的 错误集 有 不 是 改变了 通过 使用 设置 要么 组, 和 如果不 损伤 具有 是 完成 通过 伪功能 可能是 可能 至 继续计算 在 不同的 方向 什么时候 一 路径 结果 在一个 错误。
这清楚地表明,该结构适合于局部捕获错误,然后进行恢复(“在一条路径导致错误的情况下,以不同的方向继续进行计算”)。
ANSI Common Lisp“条件”从PL / I“条件”系统中获得了很多启发。但是,在Lisp 1.5的errset
之后几年,PL / I为first available in 1966。 first PL/I reference manual(日期为1965年)已经描述了接通装置和条件。