Пользовательская иерархия исключений в Scala - PullRequest
0 голосов
/ 25 марта 2019

Я читал о том, как правильно обрабатывать (Option, Try и Either) и определять исключения в Scala.

Мой вопрос: сделатьИерархии исключений имеют смысл в Scala?Например, в настоящее время у нас есть проект Scala, реализующий что-то вроде:

class ServiceException(msg: String) extends Exception(msg)
class StorageServiceException(msg: String) extends ServiceException(msg)
class StorageServiceNotAvailableException(msg: String)
  extends StorageServiceException(msg)

Существует ли идиоматический способ определения такой иерархии?Или, может быть, эта концепция полностью поглощена чем-то другим?

ЗАКЛЮЧЕНИЕ ОТ ОТВЕТОВ (см. Ответ и комментарии ниже)

Иерархия исключений имеет смысл, если вы хотите восстановитьиз не листового исключения.Хотя это не мешает вам работать с механизмами Option/Try/Either, что более идиоматично, чем традиционные try/catch.

1 Ответ

4 голосов
/ 25 марта 2019

Прежде всего, отвечая на ваш вопрос, текущая реализация иерархии исключений является идиоматическим способом объявления иерархии.Эта реализация в основном унаследована от стиля программирования Java.Вы также можете обратиться к https://stackoverflow.com/a/10925402/7803797 для получения более подробной информации.

На мой взгляд, использование таких исключений - плохая идея в Scala.Scala предоставляет красивую конструкцию, называемую тип Either, которая позволяет изящно обрабатывать исключения.Пожалуйста, пройдите https://dzone.com/articles/catching-exceptions-in-scala-part-2, чтобы понять это ясно.

Теперь объясним это более подробно ...

По сути, в функциональном программировании композиция является ключевым аспектом.Теперь, когда вы пытаетесь генерировать исключения, вы внезапно выходите из стекового фрейма, и управление кодом делегируется вызывающей стороне.Наличие такой конструкции, как Left типа Either, здесь пригодится, поскольку она не нарушает композицию.Вы все еще в том же кадре стека и выходите из метода изящно.

Надеюсь, это ответит на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...