Обработка сбоев с помощью Either -> Где находится трассировка стека?

Я слышал от некоторых людей, что в Scala мы склонны (как и другие функциональные языки) не нарушать поток управления... Вместо этого по соглашению мы возвращаем ошибку в EitherLeft,

Но как мы можем получить след от этого исключения? Сейчас я возвращаюсь в простой 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,

Другие вопросы по тегам