Как отслеживать Java исключений - PullRequest
0 голосов
/ 02 февраля 2020

В течение многих лет я был Java разработчиком, в основном разрабатывая MVC веб-приложения с использованием Spring. Я изучаю Kotlin и Android как проект саморазвития, и в основном мне это нравится. Обычно я просто все выясняю, но мне кажется, что мне здесь чего-то не хватает (поскольку мне нравится писать код, который легко поддерживать и который не подвержен исключениям). Я понимаю взаимодействие с Java, я просто запутался в том, как мой код Kotlin компилируется и не дает мне никаких предупреждений о том, что вызов метода Java вызывает исключение.

Здесь Это очень простой пример из Android Tutorials о том, как написать файл, демонстрирующий эту проблему (Из Camera Intent Tutorial). File.createTempFile () генерирует IO Exception в Java, но Kotlin позволяет мне просто вызывать этот метод, как будто ничто не генерирует никаких исключений вообще. Если я удаляю аннотацию @Throws для метода, я не получаю предупреждения о том, что я вызываю метод, который потенциально может вызвать исключение.

@Throws(IOException::class)
private fun createImageFile(): File {
    // Create an image file name
    val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    val storageDir: File = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    return File.createTempFile(
            "JPEG_${timeStamp}_", /* prefix */
            ".jpg", /* suffix */
            storageDir /* directory */
    ).apply {
        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = absolutePath
    }
}

Я просто запутался в том, как я должен это делать Следите за Java методами, которые генерируют исключения. Я знаю много исключений, и в этом примере есть исключение, но я никоим образом не знаю (или не могу знать) каждое возможное исключение для каждого вызова метода в библиотеках Java и / или Java. Должен ли я go просматривать исходный код каждого метода, который я вызываю, чтобы убедиться, что я не пропустил исключение? Это кажется очень утомительным и довольно трудоемким в крупномасштабной кодовой базе.

Это называется прекрасно из моего кода без аннотации @Throws, даже если в Java выдается исключение ввода-вывода. Как я узнаю, что метод Java создает исключение, которое мне нужно учитывать при кодировании (не глядя на исходный код)?

private fun createImageFile(): File {
    // Create an image file name
    val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    val storageDir: File = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    return File.createTempFile(
            "JPEG_${timeStamp}_", /* prefix */
            ".jpg", /* suffix */
            storageDir /* directory */
    ).apply {
        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = absolutePath
    }
}

Я прочитал документы об исключениях и на Java совместимости, мне просто интересно, есть ли более простой способ определить, если метод Java выдает исключение, а затем посмотреть на исходный код (может быть, я что-то пропустил)?

https://kotlinlang.org/docs/reference/java-interop.html https://kotlinlang.org/docs/reference/exceptions.html

//Checked Exceptions
//In Kotlin, all exceptions are unchecked, meaning that the compiler does not force you to catch any 
//of 
// them. So, when you call a Java method that declares a checked exception, Kotlin does not force you 
//to 
//do anything:
fun render(list: List<*>, to: Appendable) {
    for (item in list) {
        to.append(item.toString()) // Java would require us to catch IOException here
    }
}

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

Поскольку Kotlin не поддерживает проверенные исключения, вам не повезло при использовании библиотеки Java. Вам просто нужно усердно смотреть документы документов, которые вы вызываете.

Если вы пишете библиотеку Kotlin, вы можете упаковать свой результат в класс, который упаковывает успешный результат, или ошибка. Или вы можете использовать закрытые классы. Например:

sealed class QueryResult
class Success(val result: List<String>): QueryResult()
class IncorrectSyntaxError(val msg: String): QueryResult()
class ConnectionError(val msg: String): QueryResult()

И тогда ваша функция может вернуть один из вышеуказанных подклассов. Затем получатель может использовать инструкцию when для обработки результата:

var result: List<String>? = null
val query = doQuery()
when (query ) {
    is Success -> result = query.result
    is IncorrectSyntaxError -> showErrorMessage(query.msg)
    is ConnectionError -> showErrorMessage(query.msg)
}
0 голосов
/ 02 февраля 2020

Я предлагаю вам проверить с Intellij. Если я использую метод, генерирующий исключение в моем коде, он намекает мне. Также предлагается включить throws Exception определение моего метода

Учтите, что существует 3 метода:

A()throws Exception;
B(); //which calls A inside
C();// which calls B inside

. Этот код будет скомпилирован в Java без жалоб. Но это не лучшая практика, throw Exception очень важен, как тип возвращаемого значения в определении метода. Особенно в мульти-девелоперских проектах. Это улучшает удобство использования и документацию.

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

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

  1. какова цель метода.
  2. Будь то исключение или нет. Если так, должен ли я справиться с этим или нет.
  3. Тип возвращаемого значения, о котором вы, очевидно, знаете.

Я работаю в репозитории, поддерживаемом 200 разработчиками. И мы также практикуем вышеизложенное.

И, кроме того, у отражения Java есть библиотека Method.getExceptionTypes(), в которой будут перечислены все исключения, выданные методом во время выполнения.

Примечание: я Java разработчик и не знаю много о Kotlin грамматиках

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