Некоторые из вас, возможно, уже знакомы с использованием ключевого слова try для обработки ошибок в Swift. Для тех из вас, кто не знает, что такое try, try - это просто способ справиться с возможной ошибкой в ​​любой данной функции. Часто у нас есть функции, которые «выбрасывают», что означает, что они могут выдавать ошибку, а try - изящное ключевое слово, которое позволяет нам справиться с возможностью этих ошибок.

При создании наших приложений мы можем использовать три варианта try.

try
try?
try!

Если вас пугают эти варианты, не беспокойтесь! И если вы не знаете, какой из них использовать, не волнуйтесь, я вам помогу.

Как я упоминал ранее, try обычно используется вместе с функцией throw, поэтому мы немного поговорим о функциях throw и увидим наши try ключевые слова в действии.

Представьте, что мы пытаемся проанализировать некоторый JSON, чтобы мы могли перенести эти данные в наше приложение. Есть вероятность, что эти данные могут не попасть в наше приложение, потому что Интернет не работает или данные, из которых вы пытаетесь извлечь, больше не существуют! Это все ситуации, которые допускают возможные ошибки, когда мы пытаемся получить данные из нашего API. Однако Swift имеет встроенную функцию в своем методе JSONSerialization, который по умолчанию равен throws. Swift знает, что наша попытка получить данные может привести к некоторым ошибкам, и создал функцию, которая позволяет нам учитывать этот сценарий в том случае, если он выдает нам ошибку.

При использовании try наша функция throw должна быть заключена в оператор do-catch. Это позволяет нам настраивать обработку ошибок и выполнять определенные действия в зависимости от ошибки.

Ниже мы будем использовать try, чтобы изящно отлавливать любые ошибки.

do {
   let responseJSON = try JSONSerialization.jsonObject(with: data,   options: []) as! [[String: Any]]
   completion(responseJSON)
   } catch {
   print(“Hm, something is wrong here. Try connecting to the wifi.“)
   }

Как разработчики, использование try с оператором do-catch позволяет нам проверять наличие значимых ошибок, обрабатывать их стильно и спасать наших пользователей от разочарования. Подумайте, действительно ли мы хотим, чтобы наше приложение вылетало из строя, когда у наших пользователей нет подключения к Интернету, или мы хотим сообщить им, что это приложение продолжит работу, как только они подключатся к Wi-Fi? В подобном сценарии уведомление намного полезнее, и наш оператор do-catch позволяет нам это делать.

С другой стороны, мы также можем обрабатывать наши ошибки с помощью try?. Если у вас есть опыт работы с опционами, вы скоро поймете, что try? - это именно то, что вам нужно. try? давайте проигнорируем наши ошибки и позволим им становиться равными нулю всякий раз, когда наша функция их выдает. По этой причине нам не нужно заключать наш код в оператор do-catch. Однако нам нужно развернуть нашу переменную, если мы когда-либо присваиваем ей значение try?.

let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) as! [[String: Any]]
if let responseJSON = responseJSON {
   print("Yay! We have just unwrapped responseJSON!"
}

Приведенный выше код присваивает responseJSON необязательное значение и позволяет ему стать равным нулю, если вызываемая функция вызывает какие-либо ошибки. Использование try? полезно, когда возникшая ошибка не имеет большого значения, и мы не хотим назначать какие-либо действия для возникшей ошибки.

Поскольку наш responseJSON будет необязательным, мы можем вместо этого интегрировать оператор защиты в наш код и просто развернуть его в удобочитаемой форме.

guard let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) as! [[String: Any]] else { return }

Наконец, у нас есть try!, который работает как необязательный параметр с принудительной развёрткой. Этот вариант в основном утверждает, что, хотя функция может выдавать ошибку, этого никогда не произойдет, потому что информация, которую мы пытаемся получить, гарантированно присутствует. Другими словами, try! используется, когда мы знаем, что наш метод не может потерпеть неудачу, или если эта строка кода настолько важна, что все наше приложение может также вылететь, если действительно есть ошибка.

let responseJSON = try! JSONSerialization.jsonObject(with: data, options: []) as! [[String: Any]]

Как и все значения, которые принудительно разворачиваются, try! следует использовать осторожно.

В заключение

  • try используется с оператором do-catch и позволяет более детально подходить к обработке ошибок.
  • try? игнорирует наши ошибки и обнуляет их, если они случаются.
  • try! force разворачивает ваш код и гарантирует, что наша функция никогда не столкнется с ошибкой. В случае, если наша функция выдает ошибку, наше приложение просто вылетает.