【问题标题】:Origin of try/catch/finally syntaxtry/catch/finally 语法的由来
【发布时间】:2011-08-31 10:50:16
【问题描述】:

问词源向导的问题:哪种编程语言最先使用当今 Java/.NET 语言中的 try/catch/finally 语法?

【问题讨论】:

  • 您查询的是非常具体的 try/catch/finally 语法,还是它们背后的概念?如果是前者,比 C++ 最终没有,而 .Net 是在 Java 之后出现的。如果 Latter than Lisp 远远早于它们。

标签: programming-languages error-handling language-history


【解决方案1】:

Common Lisp 比 C++ 早了很长时间,并且基于更早的 Lisps。当然,Java 是由非常了解这一点的 Lisp 人创建的。但是Java是被C污染的Lisp,所以他们还添加了检查异常规范废话。

Common Lisp 更进一步,实际上使 catch 与 throw 例程交互,包括告诉 throw 继续。在捕获完成之前,堆栈根本不会展开。这意味着您可以抛出内存不足以及抛出失败等警告。

【讨论】:

    【解决方案2】:

    Mike Fikes 在 Twitter 上发布,Paweł Kapała 与我分享:

    MacLisp 添加了函数ERR,它表示一个错误。如果在ERRSET 表单的动态上下文中调用ERR,则ERR 的参数将作为ERRSET 表单的值返回。

    程序员很快就开始使用ERRSETERR 不是为了捕获和发出错误信号,而是为了更一般的控制目的(动态非本地退出)。不幸的是,ERRSET 的这种使用也悄悄地捕获了意外错误,使程序更难调试。一对新的原语 CATCHTHROW在 1972 年 6 月 [强调我的] 被引入 MacLisp,以便 ERRSET 可以保留用于其预期用途使用错误捕获。

    ERRSETCATCH 的教训很重要。 ERRSET 和后来的ERR 的设计者考虑到了一种特殊情况,并定义了一对原语来解决这种情况。但是由于这些工具提供了有用且强大的功能(错误捕获和动态非本地退出)的组合,程序员开始以意想不到的方式使用这些工具。然后设计师不得不返回并使用替代界面将所需的部分拆分。这种精心设计、无意使用以及后来重新设计的模式在 Lisp 的演变中很常见。

    ——来自 Guy Steele 和 Richard Gabriel 的“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>&mdash; 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>

    【讨论】:

    【解决方案3】:

    C++ 是第一个引入异常的主要编程语言(最后在 C++ 中不需要,因为析构函数是确定性的)。来自 Stroustrup 的论文:http://www2.research.att.com/~bs/hopl2.pdf

    对C++影响最大 异常处理设计是在容错系统上的工作,始于大学。 Brian Randell 和他的同事在英格兰的纽卡斯尔,此后在许多地方继续进行

    【讨论】:

    • 定义“主要”。 Lisp 通过unwind-protect 进行异常处理,当然语法非常不同。在Algol 68CLU 中有更多可识别的异常,但使用不同的关键字(不是trycatch)。
    • @Giles:这个问题非常具体:try-catch-finally 语法的异常。
    • 我也刚得到@Gillesd。他显然没有读过这个问题。
    • 是的,我只是反对你的第一句话,这与问题无关,但是错了。
    • @Gilles 如果您从字面上解释这个问题,那么 C++ 没有 finally,因此不相关。 Java 早于 .Net。但我怀疑提问者是否知道还有其他异常处理系统,而一个失败的解释更相关。
    【解决方案4】:

    我相信它是 C++ 并且我认为 Java/C# 最终添加用于资源清理(最终不在 C++ 中)。不幸的是,我没有没有参考文献...

    所有异常语法的整洁页面: http://en.wikipedia.org/wiki/Exception_handling_syntax

    我相信它是 C++。如果不是,那么 Stroustrup 需要给予信任。在他的论文中: http://www.research.att.com/~bs/except.pdf他没有提及任何影响,也没有提到他自己以外的任何其他材料。

    【讨论】:

    • C++ 中没有finally,是吗?
    • 我认为 erlang try/catch/after 早于 C++ 的任何使用,但我没有很好的参考
    • @Chris Dodd 很容易看出这不太可能(c++ 之前的 erlang) Erlang:“第一个版本是由 Joe Armstrong 在 1986 年开发的。” C++:“它是由 Bjarne Stroustrup 从 1979 年开始开发的”——来自维基百科
    • 你引用的论文是关于一种特定的实现技术。 C++ 中的异常比这更早(参见Nemanja 引用的history)。异常又比 C++ 早了十多年,但我不知道是谁介绍了精确的语法。
    • 很好的讨论,谢谢大家。之所以出现这个问题,是因为Try::Tiny 是一个 Perl 模块,它是该领域中异常处理的事实标准之一,它使用了 try-catch-finally 语法,但给出了完全不同的语义。我想确保在我讨论之前我的历史是直截了当的。
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 2011-02-20
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2011-10-31
    • 2010-11-25
    相关资源
    最近更新 更多