Spec-Zone.ru › Kotlin 1.7

Исключения

Классы исключений

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

Для выброса объекта исключения используйте выражение throw:

fun main() {
//sampleStart
    throw Exception("Hi There!")
//sampleEnd
}

Для перехвата исключения используйте выражение try...catch:

try {
    // some code
} catch (e: SomeException) {
    // handler
} finally {
    // optional finally block
}

Может быть ноль или более блоков catch, и блок finally может быть опущен. Однако, требуется как минимум один блок catch или finally.

Try – это выражение

try – это выражение, что означает, что оно может иметь возвращаемое значение:

val a: Int? = try { input.toInt() } catch (e: NumberFormatException) { null }

Возвращаемое значение выражения try – это либо последнее выражение в блоке try, либо последнее выражение в блоке catch (или блоках). Содержимое блока finally не влияет на результат выражения.

Исключения, обрабатываемые компилятором

В Kotlin нет проверочных исключений. Причин много, но мы предоставим простой пример, иллюстрирующий это.

Следующее – это пример интерфейса из JDK, реализованный классом StringBuilder:

Appendable append(CharSequence csq) throws IOException;

Это подпись говорит, что каждый раз, когда я добавляю строку к чему-то (StringBuilder, какой-то журнал, консоль и т.д.), я должен поймать исключение IOExceptions. Почему? Потому что реализация может выполнять операции ввода-вывода (Writer также реализует Appendable). Результат – код такого вида повсюду:

try {
    log.append(message)
} catch (IOException e) {
    // Must be safe
}

И это не хорошо. Просто взгляните на Effective Java, 3-е издание, пункт 77: Не игнорируйте исключения.

Брюс Эккл говорит об исключениях, обрабатываемых компилятором, так:

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

И вот некоторые дополнительные мысли по этому поводу:

  • Java's checked exceptions were a mistake (Rod Waldhoff)

  • The Trouble with Checked Exceptions (Anders Hejlsberg)

Если вы хотите оповестить вызывающие стороны о возможных исключениях при вызове кода Kotlin из Java, Swift или Objective-C, можете использовать аннотацию @Throws. Дополнительную информацию об использовании этой аннотации см. для Java и для Swift и Objective-C.

Тип Nothing

throw – это выражение в Kotlin, поэтому вы можете использовать его, например, как часть выражения Elvis:

val s = person.name ?: throw IllegalArgumentException("Name required")

Выражение throw имеет тип Nothing. Этот тип не имеет значений и используется для обозначения мест в коде, которых никогда не может быть достигнуто. В собственном коде вы можете использовать Nothing для обозначения функции, которая никогда не возвращает значение:

fun fail(message: String): Nothing {
    throw IllegalArgumentException(message)
}

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

val s = person.name ?: fail("Name required")
println(s)     // 's' is known to be initialized at this point

Вы также можете встретить этот тип при работе с выводом типов. Нулевой вариант этого типа, Nothing?, имеет ровно одно возможное значение, которое есть null. Если вы используете null для инициализации значения выведенного типа, и нет другой информации, которая может быть использована для определения более конкретного типа, компилятор выведет тип Nothing?:

val x = null           // 'x' has type `Nothing?`
val l = listOf(null)   // 'l' has type `List<Nothing?>

Взаимодействие с Java

См. раздел об исключениях на странице взаимодействия с Java для получения информации о взаимодействии с Java.

Последнее изменение: 06 сентября 2022 г.
Возвращаемые значения и переходы Пакеты и импорты

© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/exceptions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API