Как найти исключение, которое может вызвать какой-то библиотечный код - PullRequest
0 голосов
/ 27 мая 2019

Я новичок в Kotlin, и у меня есть следующая проблема: В моем проекте я использую небольшую библиотеку (JAR, нет источников).В нем определено несколько пользовательских классов исключений, которые наследуют класс Exception.Некоторые методы выдают эти исключения.

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

Как обычно справляются с такими ситуациями в Котлине?

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Я не совсем знаю правильный подход в kotlin, но вы можете использовать следующую идею из scala: Try -

try Success(r) catch {
  case NonFatal(e) => Failure(e)
}

Если исключение не является фатальным:

 case _: VirtualMachineError | _: ThreadDeath | _: InterruptedException | _: LinkageError | _: ControlThrowable => false
 case _ => true

тогда просто верните Failure(e) в противном случае бросьте его.Как вы можете использовать это?По крайней мере, у вас не получится так:

try {
...
} catch {
    case _ : Throwable => ... // catch all exceptions
}

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

Но, конечно, будет намного лучше, если в списке документов будут исключения, которые могут быть выброшены.

1 голос
/ 27 мая 2019

Обычно такие исключения должны быть объявлены в документации библиотеки, которую вы используете (либо JavaDoc, KDoc, либо веб-сайт).Не существует структурированного способа получить все исключения, которые может выдать функция, кроме декомпиляции кода и выполнения его самостоятельно.(с помощью встроенного декомпилятора, например, этот реактивный мозг поставляется в IntelliJ)

Вы также можете перехватить все исключения, но я бы всегда утверждал, что это не очень хорошее решение почти во всех случаях.

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