Published on

Swiftda Error Handling

Authors

Xato (exception) β€” bu dastur bajarilishi davomida kutilmagan hodisa. Masalan,

var numerator = 10       // surat
var denominator = 0      // maxraj

// sonni 0 ga bo'lishga urinish
var result = numerator / denominator // xato kod

Bu yerda sonni bo'lishga urinmoqdamiz. Shunday turdagi xato dasturning normal ishlashini to'xtatadi.

Swiftda xatolarni boshqarish qadamlari

  1. Xato turlarini ifodalovchi enum yaratish
  2. throws kalit so'zi yordamida xato tashlash funksiyasini yaratish
  3. try kalit so'zi yordamida funksiyani chaqirish
  4. Kodni do {...} bloki ichiga o'rash va barcha xatolarni boshqarish uchun catch {...} blokini qo'shish

1. Xatolar Enumini yaratish

Swiftda dastur yozish jarayonida duch kelishimiz mumkin bo'lgan xato turlarini ifodalovchi enum yaratishimiz kerak.

Biz yaratgan enum Error protocoliga mos kelishi kerak, shunda funksiya ichida xato qiymatini tashlashimiz mumkin bo'ladi.

Keling, misolni ko'raylik:

enum DivisionError: Error {
  case dividedByZero     // nolga bo'lish
}

Bu yerda dividedByZero qiymatiga ega DivisionError nomli enum yaratdik.

DivisionError Error protocoliga mos kelgani uchun endi enumning xato qiymatini tashlashimiz mumkin bo'ladi.

2. Xato tashlaydigan funksiya yaratish

Xatolarni tashlash uchun throws kalit so'zidan foydalanib xato tashlaydigan funksiya yaratishimiz kerak.

Keyin funksiya ichida enum tomonidan ifodalangan ma'lum bir xatoni tashlash uchun throw operatoridan foydalanamiz. Masalan,

// throws kalit so'zi yordamida xato tashlaydigan funksiya yaratish
func division(numerator: Int, denominator: Int) throws {

// 0 ga bo'lish xatosini tashlash
  if denominator == 0 {
    throw DivisionError.dividedByZero
  }
  ...     
}

Bu yerda throws kalit so'zi yordamida division() nomli xato tashlaydigan funksiya yaratdik. Agar denominator == 0 bo'lsa, funksiya DivisionError enumining dividedByZero qiymatini tashlaydi.

Endi funksiya chaqiruvi paytida uzatilgan qiymatga asoslanib, xato sharti bajarilsa, funksiya xato tashlaydi.

throw kalit so'zi return kalit so'zi bilan bir xil ta'sirga ega. return funksiyadan qiymat qaytaradi, throw esa funksiyadan xato qiymatini qaytaradi.

3. try Kalit So'zi Yordamida Funksiyani Chaqirish

Swiftda xato tashlaydigan funksiyani chaqirishda try kalit so'zidan foydalanamiz. Bu funksiya xato tashlashi mumkinligini bildiradi. Masalan,

// try kalit so'zi yordamida xato tashlaydigan funksiyani chaqirish
try division(numerator: 10, denominator: 0)

Ammo xatolarni boshqarish jarayoni hali tugallanmagan. Agar dasturni hozir ishga tushirsak, xato xabari olamiz: An error was thrown and was not caught

Shuning uchun tashlangan xatoni ushlash uchun do-catch operatoridan foydalanamiz.

4. do-catch operatori yordamida xatolarni boshqarish

Swiftda try kodini do bloki ichiga o'raymiz va barcha xatolarni boshqarish uchun catch blokini qo'shamiz. Masalan,

do {
  try division(numerator: 10, denominator: 0)
  ...
}

catch DivisionError.dividedByZero {
  // operator
}

Bu yerda xato tashlaydigan division() funksiyasini do bloki ichidan chaqirdik va funksiya xato tashlagan taqdirda uni ushlash uchun catch blokini qo'shdik.

Yuqoridagi catch bloki DivisionError ning enum qiymatiga asoslanib bajariladi.

Bu dasturimizda yuzaga kelishi mumkin bo'lgan xatolarni boshqarishning yakuniy bosqichi.

Misol:

// xato qiymatlari bilan enum yaratish
enum DivisionError: Error {

  case dividedByZero     // nolga bo'lish
}

// throws kalit so'zi yordamida xato tashlaydigan funksiya yaratish
func division(numerator: Int, denominator: Int) throws {

  // 0 ga bo'lish xatosini tashlash
  if denominator == 0 {
    throw DivisionError.dividedByZero
  }
    
  else {
    let result = numerator / denominator
    print(result)
  }
}

// do blokidan xato tashlaydigan funksiyani chaqirish
do {
  try division(numerator: 10, denominator: 0)
  print("To'g'ri bo'lish")
}

// agar funksiya xato tashlasa, xatoni ushlash
catch DivisionError.dividedByZero {
  print("Xato: Maxraj 0 bo'la olmaydi")
}

Natija:

Xato: Maxraj 0 bo'la olmaydi

Yuqoridagi misolda:

  • DivisionError β€” enum
  • division() β€” xato tashlaydigan funksiya
  • do-catch operatori xatoni boshqaradi

Xato tashlaydigan funksiyaga qiymatlarni uzatish uchun try dan foydalandik:

try division(numerator: 10, denominator: 0)

uzatilgan qiymatlar xato shartiga mos keladimi yoki yo'qligini tekshirish uchun.

Agar xato sharti:

  • bajarilsa β€” xato tashlaydigan funksiya xato tashlaydi, uni catch bloki ushlaydi
  • bajarilmasa β€” xato tashlaydigan funksiya ichidagi else operatori va do bloki ichidagi print operatori bajariladi

Xatolarni boshqarishni o'chirish

Swiftda ba'zan xato tashlaydigan funksiya runtime paytida xato tashlamasligiga ishonchimiz komil bo'lishi mumkin.

Bunday holatda xatolarni boshqarishni o'chirish uchun funksiya chaqiruvi paytida try! yozishimiz mumkin. Masalan,

enum DivisionError: Error {
  
  case dividedByZero     // nolga bo'lish
}

func division(numerator: Int, denominator: Int) throws {
  if denominator == 0 {
    throw DivisionError.dividedByZero
  }
    
  else {
    let result = numerator / denominator
    print("Natija:", result)
  }
}

// xatolarni boshqarishni o'chirish
try! division(numerator: 10, denominator: 5)

Natija:

Natija: 2

Yuqoridagi misolda xatolarni boshqarishni o'chirish uchun funksiya chaqiruvi paytida try! dan foydalandik.

try! division(numerator: 10, denominator: 5)

Bu yerda denominator ga 5 qiymatini berganimiz uchun dastur xato tashlamasligini bilamiz. Shuning uchun xatolarni boshqarishni o'chirdik.

Shuningdek, try! dan foydalanganimizda do-catch operatoridan foydalanishimiz shart emasligini unutmang.

Agar try! dan foydalansak va xato yuzaga kelsa, ilovamiz shunchaki ishdan chiqadi.

Swiftda xatolarning sabablari

Xato ko'plab sabablarga ko'ra yuzaga kelishi mumkin. Ulardan ba'zilari:

  • Noto'g'ri foydalanuvchi kiritish
  • Qurilma nosozligi
  • Tarmoq ulanishining yo'qolishi
  • Jismoniy cheklovlar (disk xotirasining tugashi)
  • Kod xatolari
  • Mavjud bo'lmagan faylni ochish

Xatolar dastur bajarilishini normal holatda to'xtatgani uchun bunday xatolarni boshqarish juda muhim.