исключений | Документация Kotlin
Классы исключений
Все классы исключений в Kotlin наследуют класс Throwable
. Каждое исключение имеет сообщение, трассировку стека и необязательную причину.
Чтобы создать объект исключения, используйте выражение throw
:
fun main() { // начало выборки выбросить исключение(«Привет!») //конец выборки }
Чтобы перехватить исключение, используйте выражение try
… catch
:
попробовать { // какой-то код } поймать (e: SomeException) { // обработчик } окончательно { // необязательный блок finally }
Может быть ноль или более блоков catch
, а блок finally
может быть опущен. Однако требуется хотя бы один блок catch
или finally
.
Try — это выражение
try
— это выражение, что означает, что оно может иметь возвращаемое значение:
val a: Int? = try { input.
Возвращаемое значение выражения try
является либо последним выражением в блоке try
, либо последним выражением в блоке catch
(или блоках). Содержимое блока finally
не влияет на результат выражения.
Проверенные исключения
В Kotlin нет проверенных исключений. Для этого есть много причин, но мы приведем простой пример, иллюстрирующий, почему это так.
Ниже приведен пример интерфейса из JDK, реализованного StringBuilder
class:
Appendable append(CharSequence csq) вызывает исключение IOException;
Эта подпись говорит о том, что каждый раз, когда я добавляю строку к чему-то (
, какой-то журнал, консоль и т. д.), я должен перехватывать 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, поэтому вы можете использовать его, например, как часть выражения Элвиса:
Выражение 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 , а затем выполнить с ним одно из двух действий:
В следующем примере показано, как создать исключение с помощью директивы
(альтернатива поднять
закомментирована):
NSException* myException = [NSException |
exceptionWithName: @"FileNotFoundException" |
причина: @"Файл не найден в системе" |
Информация о пользователе: ноль]; |
@throw myException; |
// [myException поднять]; /* эквивалент директивы выше */ |
Важное различие между @throw
и
заключается в том, что последний может быть отправлен только объекту NSException
, тогда как @throw
может принимать другие типы объектов в качестве аргумента (например, строковые объекты). Применение какао должно @throw
только объекты NSException
.
Обычно вы создаете или инициируете исключение внутри домена обработки исключений, который представляет собой блок кода, помеченный директивой компилятора @try
.
Дополнительные сведения см. в разделе Обработка исключений.
В доменах обработки исключений вы можете повторно распространять исключения, пойманные локальными обработчиками исключений, на обработчики более высокого уровня, отправив объекту NSException
еще одно сообщение поднять
или используя его с другим сообщением.0005 @throw директива. Обратите внимание, что в блоках обработки исключений @catch
вы можете повторно сгенерировать исключение без явного указания объекта исключения, как в следующем примере:
exceptionWithName:@"FileNotFoundException"
причина:@"Файл не найден в системе"
userInfo:nil];
@throw e;
}
@catch(NSException *e) {
@throw; // повторно выбрасывает e неявно
}
Существует тонкий аспект поведения, связанный с повторным выбрасыванием исключений.