Обработка сбоев с помощью Either -> Где находится трассировка стека?
Я слышал от некоторых людей, что в Scala мы склонны (как и другие функциональные языки) не нарушать поток управления... Вместо этого по соглашению мы возвращаем ошибку в Either
Left
,
Но как мы можем получить след от этого исключения? Сейчас я возвращаюсь в простой Error
case-класс с кодом, сообщением и причиной (Error
тоже). Но если у меня есть ошибка, я не могу получить трассировку стека. Если мое приложение станет сложным, может быть трудно найти блок кода, который вернул Error
... Коренная причина имеет важное значение.
Итак, что мы делаем на практике?
Должен ли я вернуться, а не обычай Error
тип Java Exception
или же Throwable
в моем Left
? Как лучше всего обрабатывать исключения в Scala без потери важной информации, такой как трассировка стека и причина?
1 ответ
Я бы предложил использовать Either[java.lang.Throwable, A]
(где Throwable
по-прежнему дает вам доступ к трассировке стека) и (в целом) расширяет ваши пользовательские типы ошибок java.lang.Exception
,
Это практика, используемая Диспетчером 0.9, например, где Either[Throwable, A]
используется для представления вычислений, которые могут быть неудачными, а пользовательские типы ошибок выглядят следующим образом:
case class StatusCode(code: Int)
extends Exception("Unexpected response status: %d".format(code))
Скалаз 7 Validation.fromTryCatch(a: => T)
также возвращает Validation[Throwable, T]
, где Validation
примерно эквивалентно Either
,