Sobes.tech
Junior

Ako odhaliť chyby v Swift?

sobes.tech AI

Odpoveď od AI

V jazyku Swift sa chyby zachytávame pomocou systému spracovania chýb založeného na kľúčových slovách throw, throws, try a bloku do-catch.

  1. Deklarácia funkcií, ktoré môžu vyhodiť chybu: Používa sa kľúčové slovo throws za parametrami funkcie.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Vyhodenie chyby
        }
        // ... logika spracovania dát ...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Spracované: \(input)"
    }
    
  2. Volanie funkcií, ktoré môžu vyhodiť chybu: Používa sa kľúčové slovo try.

    do { // Blok na spracovanie chýb
        let result = try processData(input: "valid data")
        print(result) // "Spracované: valid data"
    } catch { // Zachytenie chýb
        print("Vyskytla sa chyba: \(error)")
    }
    
  3. Zachytenie konkrétnych typov chýb: V bloku catch je možné uviesť konkrétny typ chyby.

    do {
        let result = try processData(input: "")
        print(result)
    } catch DataError.emptyData {
        print("Dáta sú prázdne, zadajte vstup.")
    } catch DataError.invalidFormat {
        print("Formát dát je neplatný.")
    } catch { // Zachytenie akýchkoľvek iných chýb
        print("Neočakávaná chyba: \(error)")
    }
    
  4. defer blok: Je vykonaný tesne pred opustením aktuálnej oblasti, bez ohľadu na to, či došlo k chybe alebo nie. Často sa používa na uvoľnenie zdrojov.

    func openFile(_ filename: String) throws -> String {
        // Predpokladáme, že otvorí súbor a vráti jeho obsah
        print("Otvorenie súboru: \(filename)")
        // ... logika otvárania ...
    
        defer {
            // Tento kód sa vykoná pred opustením funkcie,
            // aj keď nastane chyba
            print("Zatváranie súboru: \(filename)")
        }
    
        // ... spracovanie súboru ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Vyhodenie chyby
        }
    
        return "Obsah súboru"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Chyba pri spracovaní súboru: \(error)")
    }
    
  5. Voliteľný try?: Vráti voliteľnú hodnotu. Ak funkcia vyhodí chybu, try? vráti nil.

    let processedResult = try? processData(input: "") // processedResult bude nil
    let validResult = try? processData(input: "abc") // validResult bude voliteľný String s hodnotou "Processed: abc"
    
  6. Vynútený try!: Používa sa, keď ste si istí, že chyba nenastane. Ak áno, aplikácia sa neočakávane ukončí. Používajte s opatrnosťou.

    // Použite iba, ak ste 100% istí, že funkcia nevyhodí chybu
    let result = try! processData(input: "vždy platný vstup")
    

Systém založený na do-catch je jasnejší a bezpečnejší spôsob spracovania chýb v porovnaní s tradičnými výnimkami v iných jazykoch, pretože vyžaduje explicitné oznámenie funkcií, ktoré môžu vyhodiť chybu (throws), a explicitné spracovanie týchto chýb pri volaní (try, do-catch).