elm
对zero-runtime-exceptions的主张是其主要卖点之一(请参见official website),
但是,如果您停止考虑它,那么什么也不会阻止您除以零或耗尽内存。elm
编译器的基本作用是迫使您涵盖可能导致异常的所有可能路径。
例如:
import String exposing (toInt)
toIntOrZero s = case toInt s of
Err e -> 0
Ok val -> val
但这与
java
中的infamous“ checked-exceptions”功能有何不同?public static Integer toIntOrZero(String s) {
try { return Integer.valueOf(s); }
catch (NumberFormatException e) { return 0; }
}
我从没听说过
java
是零运行时例外语言的说法。 最佳答案
请不要太关注本质上是营销夸张的东西。当然,有些错误类别是您使用任何编译器都无法完全排除的。
因此,我一直对这些零运行时例外声明一无所知,但我认为我理解支持者的意图。 Elm的创建是用Javascript开发前端应用程序的替代方法,这是一个杂乱的世界,异常情况比比皆是,只是日常生活的一部分。 Elm使您难以自拔,如果不花太多精力,如果在应用程序上进行基本的健全性测试,则生产中可能永远不会有运行时异常。
榆树通过几种方式极大地减少了例外的可能性。
除了Debug.crash
之外,在语言中没有抛出异常的概念,顾名思义,该异常实际上仅应用于调试和建立不完整的逻辑路径。
由于没有可抛出的异常,因此处理问题通常是通过Result
和Maybe
这样的类型完成的。
可以认为这与Java的检查异常大致相似,但从概念上讲,它们与我感觉非常不同。面对现实吧。异常已被滥用。您提到了Java中的一个示例,其中Integer.valueOf()
表示它将返回一个int,但是如果您传递其他任何内容,它将展开堆栈并冒泡直到某些函数希望捕获它。这让我感到非常混乱,并且可以肯定的是,检查异常可以帮助减少故障传播的窗口,但是潜在的事实是,异常是错误的业务逻辑工具。
抛出异常的一种替代方法是使类与Result
和Maybe
Elm类型类似,但是在Java的早期,几乎不可能做到干净整洁,即使使用泛型,编写此类也是比Elm的类型更简单,更乏味且更容易出错。而且由于Elm的封闭式系统,
非穷尽的模式匹配会导致编译失败
在Java和Javascript中,由于类型系统不允许,因此无法进行详尽的模式匹配检查。当然,Typescript引入了一些功能,但是您必须选择使用它。在Elm中,您必须明确处理所有情况。当然,我想您可能会争辩说,Elm让您以全部捕获的_
结尾所有case语句,从而退出详尽的模式匹配,但这只是对语言的一种愚蠢的滥用。这些检查可以为您提供帮助,而我不会选择参与Elm中的错误检查,这让我感到更加安全-默认情况下,该检查就在那里!
不变性
不变性避免了潜在的错误类型的负担,这些错误太多了
Elm体系结构在Javascript和Elm之间提供了清晰的分隔
Elm可以编译为Javascript,但是Elm Architecture提供了一个很好的屏障,可以使Javascript的所有讨厌部分远离Elm编写的纯代码。 Java脚本中可能发生的任何异常都应由该障碍来处理,这样I / O错误将始终转换为Elm友好的无例外类型。
最后,运行时异常还是可能的(例如:next tagged Elm question处理了由递归Json Decoder定义引起的众所周知的运行时异常),而且我每次听到有人说无法获取时都会感到有些畏缩。榆树是一个例外。事实是,可能发生异常,但是在Elm中几乎不可能在日常Javascript开发中遇到的每个异常都是不可能的。
关于java - elm的编译与Java的检查异常有何不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46800066/