Option
или Either
- определенно способ функционального программирования.
С Option
важно документировать , почему None
может быть возвращено.
При Either
левая сторона - это неудачное значение («ошибка»), а правая сторона - это успешное значение.Левая сторона не обязательно должна быть Exception
(или ее подтипом), это может быть простое сообщение об ошибке String
(псевдонимы типа здесь ваш друг) или пользовательский тип данных, подходящий для вашего приложения..
Например, я обычно использую следующий шаблон, когда обработку ошибок с помощью Either
:
// Somewhere in a package.scala
type Error = String // Or choose something more advanced
type EitherE[T] = Either[Error, T]
// Somewhere in the program
def fooMaybe(...): EitherE[Foo] = ...
Try
следует использовать только для переноса unsafe (в большинстве случаев простой Java) код, который дает вам возможность сопоставления с шаблоном по результату:
Try(fooDangerous()) match {
case Success(value) => ...
case Failure(value) => ...
}
Но я бы предложил использовать только Try
локально, а затем перейти к вышеупомянутым даннымтипы оттуда.
Некоторые расширенные типы данных, такие как cats.effect.IO
или monix.reactive.Observable
, содержат встроенную обработку ошибок.
Я бы также посоветовал изучить cats.data.EitherT
для класса типов-основанная обработка ошибок.Прочитайте документацию, это определенно стоит.
Как примечание, для всех, кто прибывает из Java, Scala рассматривает все Exception
с, как Java обрабатывает RuntimeException
с.Это означает, что даже когда небезопасный фрагмент кода из одной из ваших зависимостей выдает (проверено) IOException
, Scala никогда не потребует от вас catch
или иным образом обработать исключение.Так что, как правило, при использовании Java-зависимостей почти всегда заключайте их в Try
(или IO
, если они выполняют побочные эффекты или блокируют поток).