Sobes.tech
Junior

Swiftda xatolarni qanday aniqlash mumkin?

sobes.tech AI

AIdan javob

Swiftda xatolar throw, throws, try kalit so'zlari va do-catch blokiga asoslangan xato bilan ishlash tizimi yordamida ushlanadi.

  1. Xatolarni chiqarishi mumkin bo'lgan funksiyalarni e'lon qilish: throws kalit so'zi funksiyaning parametrlaridan keyin ishlatiladi.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Xatoni chiqarish
        }
        // ...ma'lumotlarni qayta ishlash mantiqi...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Qayta ishlangan: \(input)"
    }
    
  2. Xatolarni chiqarishi mumkin bo'lgan funksiyalarni chaqirish: try kalit so'zi ishlatiladi.

    do { // Xatolarni boshqarish bloki
        let result = try processData(input: "to'g'ri ma'lumot")
        print(result) // "Qayta ishlangan: to'g'ri ma'lumot"
    } catch { // Xatolarni ushlash bloki
        print("Xato yuz berdi: \(error)")
    }
    
  3. Alohida xatolarning turlarini ushlash: catch blokida aniq xatolik turi ko'rsatilishi mumkin.

    do {
        let result = try processData(input: "")
        print(result)
    } catch DataError.emptyData {
        print("Ma'lumotlar bo'sh, iltimos, kirish ma'lumotlarini taqdim eting.")
    } catch DataError.invalidFormat {
        print("Ma'lumotlar formati noto'g'ri.")
    } catch { // Boshqa xatolarni ushlash
        print("Kutilmagan xato yuz berdi: \(error)")
    }
    
  4. defer bloki: Bu blok hozirgi doiradan chiqishdan darhol oldin bajariladi, xatolik bo'lsa ham yoki bo'lmasa ham. Resurslarni tozalash uchun ko'pincha ishlatiladi.

    func openFile(_ filename: String) throws -> String {
        // Faraz qilaylik, bu faylni ochadi va uning mazmunini qaytaradi
        print("Fayl ochilyapti \(filename)")
        // ... ochish mantiqi...
    
        defer {
            // Bu kod funksiyadan chiqishdan oldin bajariladi,
            // hatto xato bo'lsa ham
            print("Fayl yopilyapti \(filename)")
        }
    
        // ... faylni qayta ishlash ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Xato chiqarish
        }
    
        return "Fayl mazmuni"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Fayl bilan ishlashda xato: \(error)")
    }
    
  5. try? ixtiyoriy: Bu ixtiyoriy qiymatni qaytaradi. Agar funksiya xato chiqaradigan bo'lsa, try? nil qaytaradi.

    let processedResult = try? processData(input: "") // processedResult nil bo'ladi
    let validResult = try? processData(input: "abc") // validResult ixtiyoriy String bo'lib, qiymati "Processed: abc" bo'ladi
    
  6. Majburiy try!: Bu, xato yuz bermasligiga ishonch hosil qilingan hollarda ishlatiladi. Agar xato yuz bersa, ilova avto tarzda to'xtaydi. Ehtiyot bo'ling.

    // Faqat, agar siz 100% ishonch bilan funksiyaning xato bermasligiga ishonchingiz komil bo'lsa foydalaning
    let result = try! processData(input: "doimiy valid kirish")
    

do-catch asosidagi tizim, boshqa tillardagi an'anaviy istisnolarga nisbatan, xatolarni boshqarish uchun yanada aniqroq va xavfsizroq usuldir, chunki u xatolarni chiqarishi mumkin bo'lgan funksiyalarni (throws) aniq belgilashni va ularni chaqirishda (try, do-catch) aniq boshqarishni talab qiladi.