elm的编译与Java检查的异常有何不同?

Uri*_*ren 2 java checked-exceptions elm

elm零运行时例外的主张是其主要卖点之一(见官方网站),

但是,如果你停下来思考它,没有什么可以阻止你除以零或耗尽内存.

什么elm编译器基本上没有,强迫你以涵盖所有可能的路径,可导致异常.

例如:

import String exposing (toInt)
toIntOrZero s = case toInt s of
                          Err e -> 0
                          Ok val -> val
Run Code Online (Sandbox Code Playgroud)

但这与臭名昭着的 "检查例外"功能java有何不同?

public static Integer toIntOrZero(String s) {
    try { return Integer.valueOf(s); }
    catch (NumberFormatException e) { return 0; }
}
Run Code Online (Sandbox Code Playgroud)

我从来没有听说过任何java零运行时异常语言.

Cha*_*ert 5

请不要过于关注什么本质上是营销夸张.当然,有些类型的错误,您永远无法完全排除任何编译器.

因此,我总是把这些零运行时异常声明带到一点点,但我想我理解了提议者的意图.Elm是作为在Javascript中开发前端应用程序的替代方法而创建的,这是一个混乱的世界,异常比比皆是,只是日常生活的一部分.榆树让自己更难以自拔,如果你在应用程序上进行基本的健全性测试,没有太多的努力,你可能不会在生产中遇到运行时异常.

榆树在几个方面大大减少了例外的可能性.

  1. 除了Debug.crash名称之外,语言中没有可抛出异常的概念,正如其名称所暗示的那样,它实际上应仅用于调试和删除不完整的逻辑路径.

由于没有抛出异常,处理问题通常都是通过类型,如做ResultMaybe.

这可以被认为与Java检查过的异常相似,但在概念上他们感觉与我有很大的不同.面对现实吧.例外被滥用.你在Java中提到了一个例子,其中Integer.valueOf()说它将返回一个int但是如果你传递了其他任何东西,它会展开堆栈并冒泡直到某个函数有希望捕获它.这对我来说非常麻烦,确定,检查异常可以帮助减少故障传播的窗口,但潜在的事实是异常是业务逻辑的错误工具.

抛出异常的另一种方法是让类ResultMaybeElm类型类似,但是在Java的早期几乎不可能干净利落地完成,即使使用泛型,编写这样的类型比使用它更加乏味和容易出错.榆树类型的简单性.而且由于榆树的封闭式系统,

  1. 非穷举模式匹配导致编译失败

在Java和Javascript中,没有办法进行详尽的模式匹配检查,因为类型系统不允许它.当然,Typescript已经引入了一些功能,但你必须选择它.在Elm中,您必须明确处理所有情况.当然,我想你可以说Elm让你选择退出详尽的模式匹配,通过结束所有案例陈述_,但这只是对语言的愚蠢滥用.那些检查可以帮助你,而且我觉得更安全,因为我没有选择加入Elm中的错误检查 - 默认情况下它就在那里!

  1. 不变性

不变性避免了大量潜在类型的错误,太多了,无法进入这里

  1. Elm Architecture提供了Javascript和Elm之间的清晰分离

Elm编译为Javascript,但是Elm Architecture提供了一个很好的清洁屏障,可以使Javascript的所有讨厌的内容远离Elm编写的纯代码.Javascript中可能发生的任何异常都应由该障碍处理,这样I/O错误将始终转换为Elm友好的,无异常类型.

最后,运行时异常仍然是可能的(例如:下一个标记的Elm问题处理由递归Json解码器定义引起的众所周知的运行时异常),当我听到有人说它不可能时,我会畏缩一点在榆树中得到例外.问题的实例是异常是可能的,但几乎每天在日常Javascript开发中遇到的异常在Elm中基本上是不可能的.