Sobes.tech
Junior

Kaip aptikti klaidas Swift?

sobes.tech AI

Atsakymas iš AI

Swift'e klaidos gaudomos naudojant klaidų valdymo sistemą, pagrįstą raktažodžiais throw, throws, try ir do-catch bloku.

  1. Funkcijų, kurios gali išmesti klaidas, deklaravimas: Naudojamas raktažodis throws po funkcijos parametrais.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Metama klaida
        }
        // ... duomenų apdorojimo logika ...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Processed: \(input)"
    }
    
  2. Funkcijų, kurios gali išmesti klaidas, kvietimas: Naudojamas raktažodis try.

    do { // Klaidos apdorojimo blokas
        let result = try processData(input: "valid data")
        print(result) // "Processed: valid data"
    } catch { // Klaidos gaudymas
        print("An error occurred: \(error)")
    }
    
  3. Konkrečių klaidų tipų gaudymas: catch bloke galima nurodyti konkretų klaidos tipą.

    do {
        let result = try processData(input: "")
        print(result)
    } catch DataError.emptyData {
        print("Data is empty, please provide input.")
    } catch DataError.invalidFormat {
        print("Data format is invalid.")
    } catch { // Bet kokių kitų klaidų gaudymas
        print("An unexpected error occurred: \(error)")
    }
    
  4. defer blokas: Vykdomas tiesiog prieš išeinant iš dabartinės srities, nepriklausomai nuo to, ar įvyko klaida, ar ne. Dažnai naudojamas išteklių valymui.

    func openFile(_ filename: String) throws -> String {
        // Tarkime, atidaro failą ir grąžina jo turinį
        print("Opening file \(filename)")
        // ... atidarymo logika ...
    
        defer {
            // Šis kodas bus vykdomas prieš išeinant iš funkcijos,
            // net jei įvyks klaida
            print("Closing file \(filename)")
        }
    
        // ... failo apdorojimas ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Metama klaida
        }
    
        return "File content"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Error handling file: \(error)")
    }
    
  5. Pasirinktinė try?: Grąžina pasirinktinę reikšmę. Jei funkcija išmeta klaidą, try? grąžina nil.

    let processedResult = try? processData(input: "") // processedResult bus nil
    let validResult = try? processData(input: "abc") // validResult bus pasirinktinė String reikšmė "Processed: abc"
    
  6. Priverstinis try! išgavimas: Naudojamas, kai esate tikri, kad klaida neįvyks. Jei klaida įvyks, programa staiga sustos. Naudokite atsargiai.

    // Naudokite tik jei 100% įsitikinote, kad funkcija nekelia klaidos
    let result = try! processData(input: "always valid input")
    

Sistema, pagrįsta do-catch, yra aiškesnis ir saugesnis klaidų apdorojimo būdas, palyginti su tradiciniais išimtimis kitose kalbose, nes ji reikalauja aiškiai deklaruoti funkcijas, kurios gali išmesti klaidas (throws), ir aiškiai apdoroti šias klaidas kviečiant (try, do-catch).