Sobes.tech
Junior

Jak odhalit chyby ve Swift?

sobes.tech AI

Odpověď od AI

V jazyce Swift jsou chyby zachycovány pomocí systému zpracování chyb založeného na klíčových slovech throw, throws, try a bloku do-catch.

  1. Deklarace funkcí, které mohou vyhodit chybu: Používá se klíčové slovo throws za parametry funkce.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Vyhození chyby
        }
        // ... logika zpracování dat ...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Zpracováno: \(input)"
    }
    
  2. Volání funkcí, které mohou vyhodit chybu: Používá se klíčové slovo try.

    do { // Blok pro zpracování chyb
        let result = try processData(input: "valid data")
        print(result) // "Zpracováno: valid data"
    } catch { // Zachycení chyb
        print("Došlo k chybě: \(error)")
    }
    
  3. Zachycení konkrétních typů chyb: V bloku catch lze uvést konkrétní typ chyby.

    do {
        let result = try processData(input: "")
        print(result)
    } catch DataError.emptyData {
        print("Data jsou prázdná, zadejte vstup.")
    } catch DataError.invalidFormat {
        print("Formát dat je neplatný.")
    } catch { // Zachycení všech ostatních chyb
        print("Nastala neočekávaná chyba: \(error)")
    }
    
  4. Blok defer: Je vykonán těsně před opuštěním aktuálního rozsahu, bez ohledu na to, zda došlo k výjimce nebo ne. Často se používá k uvolnění zdrojů.

    func openFile(_ filename: String) throws -> String {
        // Předpokládáme, že otevře soubor a vrátí jeho obsah
        print("Otevírám soubor: \(filename)")
        // ... logika otevírání ...
    
        defer {
            // Tento kód se provede před opuštěním funkce,
            // i když dojde k chybě
            print("Zavírám soubor: \(filename)")
        }
    
        // ... zpracování souboru ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Vyhození chyby
        }
    
        return "Obsah souboru"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Chyba při zpracování souboru: \(error)")
    }
    
  5. Volitelný try?: Vrací volitelnou hodnotu. Pokud funkce vyhodí chybu, try? vrátí nil.

    let processedResult = try? processData(input: "") // processedResult bude nil
    let validResult = try? processData(input: "abc") // validResult bude volitelný String s hodnotou "Processed: abc"
    
  6. Vynucený try!: Používá se, když jste si jisti, že chyba nenastane. Pokud ano, aplikace se neočekávaně ukončí. Používejte opatrně.

    // Použijte pouze, pokud jste 100% jisti, že funkce nevyhodí chybu
    let result = try! processData(input: "vždy platný vstup")
    

Systém založený na do-catch je jasnější a bezpečnější způsob zpracování chyb ve srovnání s tradičními výjimkami v jiných jazycích, protože vyžaduje explicitní deklaraci funkcí, které mohou vyhodit chybu (throws), a jejich explicitní zpracování při volání (try, do-catch).