исключений | Документация Kotlin

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

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

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

fun main() { // начало выборки выбросить исключение(«Привет!») //конец выборки }

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

попробовать { // какой-то код } поймать (e: SomeException) { // обработчик } окончательно { // необязательный блок finally }

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

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

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

val a: Int? = try { input.

toInt() } catch (e: NumberFormatException) { null }

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

Проверенные исключения

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

Ниже приведен пример интерфейса из JDK, реализованного StringBuilder class:

Appendable append(CharSequence csq) вызывает исключение IOException;

Эта подпись говорит о том, что каждый раз, когда я добавляю строку к чему-то (

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

try { log.append(сообщение) } поймать (IOException e) { // Должен быть безопасным }

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

Брюс Эккель говорит о проверенных исключениях следующее:

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

  • Проверенные исключения Java были ошибкой (Род Вальдхофф)

  • Проблема с проверенными исключениями (Anders Hejlsberg 9)

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

Тип Nothing

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

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

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

fun fail(message: String): Ничего { бросить исключение IllegalArgumentException (сообщение) }

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

val s = person.name ?: fail(«Требуется имя») println(s) // известно, что ‘s’ инициализирован в этой точке

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

val x = null // ‘x’ имеет тип `Ничего?` val l = listOf(null) // ‘l’ имеет тип `List

Совместимость с Java

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

Последнее изменение: 20 марта 2023 г.

Возвраты и переходы Пакеты и импорт

Генерация исключений

NextPrevious

Как только ваша программа обнаружит исключение, она должна распространить его на код, который его обрабатывает. Этот код называется обработчиком исключений. Весь этот процесс распространения исключения называется «созданием исключения» (или «созданием исключения»).0005 NSException , а затем выполнить с ним одно из двух действий:

В следующем примере показано, как создать исключение с помощью директивы

@throw (альтернатива поднять закомментирована):

 NSException* myException = [NSException 
 exceptionWithName: @"FileNotFoundException" 
 причина: @"Файл не найден в системе" 
 Информация о пользователе: ноль]; 
 @throw myException; 
 // [myException поднять]; /* эквивалент директивы выше */ 

Важное различие между @throw и

raise заключается в том, что последний может быть отправлен только объекту NSException , тогда как @throw может принимать другие типы объектов в качестве аргумента (например, строковые объекты). Применение какао должно @throw только объекты NSException .

Обычно вы создаете или инициируете исключение внутри домена обработки исключений, который представляет собой блок кода, помеченный директивой компилятора @try .

Дополнительные сведения см. в разделе Обработка исключений.

В доменах обработки исключений вы можете повторно распространять исключения, пойманные локальными обработчиками исключений, на обработчики более высокого уровня, отправив объекту NSException еще одно сообщение поднять или используя его с другим сообщением.0005 @throw директива. Обратите внимание, что в блоках обработки исключений @catch вы можете повторно сгенерировать исключение без явного указания объекта исключения, как в следующем примере:

 exceptionWithName:@"FileNotFoundException" 
 причина:@"Файл не найден в системе" 
 userInfo:nil]; 
 @throw e; 
 } 
 @catch(NSException *e) { 
 @throw; // повторно выбрасывает e неявно 
 } 

Существует тонкий аспект поведения, связанный с повторным выбрасыванием исключений.