向那里的词源学向导提出的问题:哪种编程语言最先使用当今 Java/.NET 语言中的 try/catch/finally 语法?
4 回答
我相信它是 C++ 并且我认为 Java/C# 最终添加用于资源清理(最终不在 C++ 中)。不幸的是,我没有参考资料……还没有。
所有异常语法的整洁页面: http ://en.wikipedia.org/wiki/Exception_handling_syntax
我相信它是C++。如果不是,那么 Stroustrup 需要给予信任。在他的论文中: http ://www.research.att.com/~bs/except.pdf他没有提到任何影响,也没有参考他自己以外的任何其他材料。
由Mike Fikes在 Twitter 上发布, Paweł Kapała与我分享:
MacLisp 添加了函数
ERR
,它表示错误。如果ERR
在表单的动态上下文中调用ERRSET
,则参数 toERR
作为表单的值返回ERRSET
。程序员很快就开始使用
ERRSET
,而ERR
不是捕获和发出错误信号,而是用于更一般的控制目的(动态非本地退出)。不幸的是,这种使用ERRSET
也悄悄地捕获了意外错误,使程序更难调试。一对新的原语CATCH
and于 1972 年 6 月THROW
被引入 MacLisp [强调我的],因此可以保留其用于错误捕获的预期用途。ERRSET
ERRSET
和的教训CATCH
很重要。的设计者ERRSET
和后来的设计者ERR
考虑到了一种特定的情况,并定义了一对原语来解决这种情况。但是由于这些工具提供了有用且强大的功能(错误捕获和动态非本地退出)的组合,程序员开始以意想不到的方式使用这些工具。然后设计师不得不返回并使用替代界面将所需的部分拆分。这种精心设计、无意使用以及后来重新设计的模式在 Lisp 的演变中很常见。
——摘自盖伊斯蒂尔和理查德加布里埃尔的“Lisp 的演变”
来源:https ://twitter.com/mfikes/status/881943130588753920
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">“The Evolution of Lisp,” by Guy Steele and Richard Gabriel</p>— Mike Fikes (@mfikes) <a href="https://twitter.com/mfikes/status/881950560508940288">July 3, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
C++ 是第一个引入异常的主要编程语言(最后在 C++ 中不需要,因为析构函数是确定性的)。来自 Stroustrup 的论文:http ://www2.research.att.com/~bs/hopl2.pdf
对 C++ 异常处理设计的最大影响是由 Brian Randell 和他的同事在英国纽卡斯尔大学开始的容错系统工作,此后在许多地方继续进行
Common Lisp 比 C++ 早了很长时间,并且基于更早的 Lisps。当然,Java 是由非常了解这一点的 Lisp 人创建的。但是Java是被C污染的Lisp,所以他们还添加了检查异常规范废话。
Common Lisp 更进一步,实际上使 catch 与 throw 例程交互,包括告诉 throw 继续。在捕获完成之前,堆栈根本不会展开。这意味着您可以抛出诸如内存不足以及抛出失败之类的警告。