Я видел много раз фрагменты кода scala, используя Option (для простых значений) или Либо [List [Error], T] для обработки ошибок.
это дает место для кода вроде этого
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 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)
)
}
)
}
)
Что создает не очень приятное вложение кода, заставляет вас справляться с ошибками на каждом шаге, а также заставляет вас возвращать все ваши функции Aither [...]
Итак, я хотел бы знать, если
-
использование исключений не рекомендуется в scala (или вообще функциональном программировании)
-
есть какие-либо недостатки в их использовании (относительно неизменяемости или кода concurrency)
-
исключения как-то противоречат принципам или функциональному программированию
-
вы можете придумать лучший способ кодирования данного примера
-
Можно было бы избежать вложенности, выйдя из функции, как только ошибка будет найдена с помощью оператора return, но использование return также не рекомендуется в scala...