Either
不仅可以用于异常。例如,如果您要让用户为您键入输入或指定包含该输入的文件,您可以将其表示为Either[String, File]
.
Either
经常用于异常处理。Either
和受检异常的主要区别在于控制流Either
总是显式的。编译器真的不会让你忘记你正在处理一个Either
; 它不会在您不知道的情况下从多个地方收集Either
s,返回的所有内容都必须是Either
,等等。因此,您Either
不要在可能出现异常情况时使用,而是作为控制程序的正常部分执行。此外,Either
不捕获堆栈跟踪,使其比典型异常更有效。
另一个区别是异常可用于控制流。需要跳出三个嵌套循环?没问题——抛出异常(没有堆栈跟踪)并在外部捕获它。需要跳出五个嵌套的方法调用?没问题!要么不提供这样的东西。
也就是说,正如您所指出的,有许多相似之处。你可以传回信息(虽然Either
这很简单,而检查异常让你编写自己的类来存储你想要的任何额外信息);你可以把它传递Either
下去,或者你可以把它折叠成别的东西,等等。
因此,总而言之:尽管您可以在Either
显式错误处理方面使用检查异常来完成相同的事情,但它们在实践中是相对不同的。特别是,Either
使创建和传回不同的状态变得非常容易,而受检异常擅长绕过所有正常的控制流,希望返回到可以明智地处理异常情况的地方。