我已经多次看到使用 Option(用于简单值)或 Either[List[Error], T] 处理错误的 scala 代码。
这为这样的代码提供了空间
def createApplicationToken(accessToken: AccessToken): Either[List[Error], ApplicationToken] = {
// go to social info provider and fetch information
retrieveProviderInfo(accessToken).fold(
errors => Left(errors),
info => {
// try to find user using the info from the provider
// if it's not there, create user
User.findOrCreateFromProviderInfo(info).fold(
errors => Left(errors),
user => {
// try to create a fresh token and save it to the user
user.refreshApplicationToken.fold(
errors => Left(errors),
user => Right(user.token)
)
}
)
}
)
这会产生不太好的代码嵌套,迫使您处理每一步的失败,还迫使您让所有函数返回一个 Either[...]
所以我想知道是否
在scala(或一般的函数式编程)中不鼓励使用异常
使用它们有任何缺点(关于不变性或代码并发性)
异常与原则或函数式编程有某种冲突
您可以想出一种更好的方法来编写给定的示例
--
一旦使用 return 语句发现错误,可以通过退出函数来避免嵌套,但在 scala 中也不鼓励使用 return...