Scala处理Either类型错误并正确返回目标值的实现方法
报错原因
你的代码存在两个核心问题,直接触发类型不匹配报错:
- 方法签名声明返回值类型为
A,但末尾直接返回的value是Either[Throwable, A]类型,二者类型完全不符,这是IDE提示Found: (value : Either[Throwable, A]) Required: A的直接原因。 - 分支逻辑写法错误:
println("error: " + value) + playAgain中println返回值为Unit,用+拼接playAgain无法实现顺序执行逻辑;且你仅判断了左值(Throwable错误分支),没有对分支做对应返回处理,无论入参是左还是右,代码最后都会直接返回整个Either对象。
正确实现方案
处理Either类型最安全、可读性最高的方式是使用模式匹配,完整实现代码如下:
def throwAndPlayAgainOrGet[A](value: Either[Throwable, A]): A = { value match { case Left(error) => // 错误分支:打印错误信息,执行playAgain逻辑并返回其结果 println(s"error: ${error.getMessage}") playAgain case Right(validValue) => // 正常值分支:直接返回取出的A类型值 validValue } }
其他等价实现
你也可以用Either自带的fold方法实现相同逻辑,代码更精简:
def throwAndPlayAgainOrGet[A](value: Either[Throwable, A]): A = { value.fold( error => { println(s"error: ${error.getMessage}") playAgain }, validValue => validValue ) }
注意事项
- 请保证
playAgain方法的返回值类型和泛型A一致,否则会出现两个分支返回类型不匹配的新报错。 - 不建议手动调用
isLeft/isRight判断后强转取值,这类写法容易遗漏分支触发运行时异常,Scala提供的模式匹配、fold等方法已经可以安全覆盖这类取值场景。
内容的提问来源于stack exchange,提问作者helloworld
相关产品推荐
相关产品推荐

