Обработка ошибок в Swift
Обработка ошибок в Swift
- Ошибки — это типы, соответствующие протоколу
Error. - Функции, которые могут выбрасывать ошибки, помечаются ключевым словом
throws. - Обработка ошибок осуществляется с помощью:
do-catchtry?(преобразует результат вOptional)try!(игнорирует ошибку, вызывает панику при её возникновении)
- Нет иерархии наследования: вместо этого используются перечисления (
enum) для группировки связанных ошибок.
Встроенные типы ошибок в стандартной библиотеке Swift
Swift не предоставляет большого количества предопределённых классов ошибок. Однако в Foundation и других системных фреймворках Apple определены следующие важные типы:
1. NSError (из Foundation)
- Объектно-ориентированное представление ошибки, совместимое с Objective-C.
- Содержит:
domain: String— домен ошибки (например,"NSCocoaErrorDomain")code: Int— числовой кодuserInfo: [String: Any]— дополнительные данные
- Соответствует протоколу
Error, поэтому может использоваться сthrow.
2. Системные перечисления ошибок (в Foundation и других фреймворках)
Хотя Swift сам по себе не определяет глобальных классов вроде IndexError, Apple предоставляет типизированные ошибки через перечисления:
DecodingError,EncodingError(вFoundation) — ошибки сериализации/десериализации JSON и других форматов.URLError(вFoundation) — ошибки сетевых запросов (например, отсутствие соединения, недопустимый URL).POSIXError— ошибки уровня POSIX (например,ENOENT,EACCES), представлены как перечисление с кейсами:.noSuchFileOrDirectory.permissionDenied.fileExists- и др.
CocoaError— ошибки, связанные с файловой системой, архивацией, свойствами и т.д.
Пример:
enum FileOperationError: Error {
case fileNotFound
case permissionDenied
case invalidFormat
}
3. Ошибки времени выполнения (аварийные завершения)
Эти ситуации не являются исключениями, а вызывают панику (fatal error):
- Выход за границы массива:
Index out of range - Принудительное разворачивание
nil:Unexpectedly found nil - Деление на ноль (для целых чисел)
- Нарушение precondition/assertion
Такие ошибки нельзя перехватить с помощью do-catch.
Особенности:
- Нет общего базового класса ошибок — только протокол
Error. - Перечисления (
enum) — рекомендуемый способ определения пользовательских ошибок. - Совместимость с NSError: при вызове Objective-C API ошибки автоматически преобразуются в
NSError, который соответствуетError. - Локализация: ошибки могут предоставлять локализованные описания через
LocalizedError(подпротоколError).
Пример использования:
enum NetworkError: Error {
case invalidURL
case noData
case decodingFailed
}
func fetchData() throws -> Данные {
guard let url = URL(string: "https://example.com") else {
throw NetworkError.invalidURL
}
// ...
}
Нет типов ошибок
В Swift нет фиксированного списка «типов ошибок», аналогичного Python или Java, потому что:
- Ошибки определяются как любые типы, соответствующие протоколу
Error. - Стандартная библиотека Swift почти не содержит встроенных ошибок.
- Основные системные ошибки предоставляются через Foundation в виде
NSError,URLError,DecodingError,POSIXErrorи подобных типов. - Пользовательские ошибки создаются явно, чаще всего как
enum.
Таким образом, модель ошибок в Swift — протокол-ориентированная и композиционная, без иерархии наследования.
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). История Swift — это история осознанного инженерного выбора — отказа от технического долга, накопленного десятилетиями использования Objective-C, и попытки построить с нуля язык, адекватно отвечающий… Swift — это язык программирования, разработанный Apple для создания высокопроизводительных, безопасных и выразительных приложений. С момента своего появления в 2014 году Swift превратился из… Фундамент для начинающего программиста - что повторить, как работать, чего ожидать. Набор советов, правил, принципов и обычаев в разработке на этом языке. Интерфейс класса служит контрактом между разработчиком класса и его пользователями. Он определяет, как взаимодействовать с объектом, не раскрывая механизмов работы. Foundation не является частью Swift как языка — это отдельный фреймворк, но он настолько прочно интегрирован, что считается полустандартным. На платформах Apple он поставляется вместе с ОС; на Linux… Кавычки, точки, запятые, скобки и прочие знаки препинания. Ключевое слово Значение Пример ---------------------------------- async Указание асинхронной функции func fetchData() async - Данные await Ожидание завершения асинхронной операции let Данные = await… Набор функций, которые включены в стандартную библиотеку языка. Типизация, набор правил определения типа данных значений языка. Особое внимание в Swift уделено безопасности при работе с целочисленными типами. Оператор получения остатка от деления () доступен только для целых чисел. Он возвращает остаток после целочисленного… Combine — реактивный фреймворк от Apple, позволяющий моделировать потоки данных как последовательности событий. Используется для обработки уведомлений, сетевых ответов, изменений в модели и…История языка Swift
Экосистема приложений на Swift
Что требуется знать перед началом изучения языка программирования Swift
Рекомендации по разработке на Swift
Объектно-ориентированное программирование в Swift
Основы языка Swift
Синтаксис и пунктуация в Swift
Ключевые слова языка Swift
Встроенные функции и методы Swift
Типы данных и объявление переменных
Управляющие конструкции и циклы в Swift
Фреймворки Apple и сторонние решения