Определение всех возможных исключений, которые выдает функция Scala - PullRequest
3 голосов
/ 03 декабря 2011

Каков наилучший способ определить все исключения, которые могут быть вызваны определенной библиотечной функцией в Scala, чтобы клиентский код мог решить, обрабатывать ли исключения?

Тот факт, что Scala не имеет проверенных исключений, удобен, но я все же хотел бы знать, какие возможные исключительные события должен учитывать код при использовании определенной функции.

Документы Scala для библиотек, как правило, не содержат документов об исключениях.

Как пользователи Scala гарантируют, что их клиентский код учитывает различные исключительные события, генерируемые библиотечными функциями?

Ответы [ 2 ]

8 голосов
/ 03 декабря 2011

Любой библиотечный метод, который может принимать аргумент функции, может вызвать любое исключение:

List(1).map(_ => throw new SomeExceptionIJustInvented)

К сожалению, это означает, что в отсутствие сложной системы отслеживания исключений на основе компилятора этодо программиста, чтобы понять, какие исключения могут быть сгенерированы на основе документации библиотеки и опыта.

Если очень важно написать код, устойчивый к исключениям, лучший способ - перехватить все исключенияиз относительно больших блоков кода.Удостоверьтесь, что вы ловите только Exception, а не все метания, так как вы, вероятно, не можете сделать ничего нормального с ошибкой нехватки памяти.Итак:

try {
  // Various stuff
}
catch {
  case e: Exception => // Handle the case where stuff fails
}

К счастью, библиотеки Java явно говорят, что они собираются генерировать, а библиотеки Scala почти всегда выдают очень мало и вместо этого возвращают Option или Either или имеют какой-то другой способуведомлять вас, когда что-то не сработало, кроме выдачи исключения.Однако библиотеки Scala, использующие библиотеки Java, иногда немного непрозрачны.(Например, если вы делаете IO, вполне безопасно, что IOException может быть брошено.)

2 голосов
/ 03 декабря 2011

Такого общего пути не существует.В частности, любой не финальный метод может быть переопределен, чтобы вообще вызвать любое исключение.

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