是否等同于已检查的异常?

Man*_*idt 11 functional-programming scala

从Scala开始,阅读Either我自然地将新概念与我所知道的事物进行比较(在本例中来自Java).与检查异常的概念有什么不同Either吗?

在这两种情况下

  • 失败的可能性在方法中明确注释(throws或返回Either)
  • 程序员可以直接处理错误情况或将其向上移动(再次返回Either)
  • 有一种方法可以通知呼叫者错误的原因

我想在Either编写代码时会使用for-comprehensions,因为没有类似于checked异常的错误.

我想知道我是否是唯一一个遇到问题的初学者.

谢谢

Rex*_*err 12

Either可以用于不仅仅是异常.例如,如果您要让用户为您输入输入或指定包含该输入的文件,则可以将其表示为Either[String, File].

Either经常用于异常处理.Either和检查异常之间的主要区别在于控制流Either始终是显式的.编译器真的不会让你忘记你正在处理一个Either; 它不会Either在没有你知道的情况下从多个地方收集s,返回的所有东西都必须是Either等等.因此,你Either可能不会使用非常特殊的东西会出错,而是作为控制程序的正常部分执行.此外,Either不捕获堆栈跟踪,使其比典型异常更有效.

另一个区别是异常可用于控制流程.需要跳出三个嵌套循环?没问题 - 抛出一个异常(没有堆栈跟踪)并在外面捕获它.需要跳出五个嵌套方法调用吗?没问题!要么不提供这样的东西.

也就是说,正如你所指出的,有许多相似之处.您可以传回信息(虽然这样Either做很简单,但经过检查的异常会让您编写自己的类来存储您想要的任何额外信息); 你可以传递Either,或者你可以折叠成其他东西等.

总而言之:尽管您可以Either使用明确的错误处理来完成相同的事情并检查异常,但它们在实践中却相对不同.特别是,Either创建和传回不同的状态非常容易,而经过检查的异常很好地绕过所有正常的控制流程,希望能够回到可以合理处理特殊情况的某个地方.