Sobes.tech
Junior

Kā atklāt kļūdas Swift?

sobes.tech AI

Atbilde no AI

Swift kļūdu apstrādes sistēma, kas balstīta uz atslēgvārdiem throw, throws, try un do-catch bloku.

  1. Funkciju, kas var izraisīt kļūdas, deklarēšana: Tiek izmantots atslēgvārds throws pēc funkcijas parametriem.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Izsauc kļūdu
        }
        // ... datu apstrādes loģika ...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Processed: \(input)"
    }
    
  2. Funkciju, kas var izraisīt kļūdas, izsaukšana: Tiek izmantots atslēgvārds try.

    do { // Kļūdu apstrādes bloks
        let result = try processData(input: "valid data")
        print(result) // "Processed: valid data"
    } catch { // Kļūdu noķeršana
        print("An error occurred: \(error)")
    }
    
  3. Konkrētu kļūdu tipu noķeršana: catch blokā var norādīt konkrētu kļūdas tipu.

    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 { // Visu citu kļūdu noķeršana
        print("An unexpected error occurred: \(error)")
    }
    
  4. defer bloks: Tiek izpildīts tieši pirms iziešanas no pašreizējās skopijas, neatkarīgi no tā, vai notika izņēmums vai nē. Bieži tiek izmantots resursu tīrīšanai.

    func openFile(_ filename: String) throws -> String {
        // Pieņemsim, ka tas atver failu un atgriež tā saturu
        print("Opening file \(filename)")
        // ... atvēršanas loģika ...
    
        defer {
            // Šis kods tiks izpildīts pirms funkcijas iziešanas,
            // pat ja notiks kļūda
            print("Closing file \(filename)")
        }
    
        // ... faila apstrāde ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Izsauc kļūdu
        }
    
        return "File content"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Error handling file: \(error)")
    }
    
  5. Opcijonālais try?: Atgriež opciju vērtību. Ja funkcija izsauc kļūdu, try? atgriež nil.

    let processedResult = try? processData(input: "") // processedResult būs nil
    let validResult = try? processData(input: "abc") // validResult būs opciju String ar vērtību "Processed: abc"
    
  6. Piespiedu try!: Tiek izmantots, kad esat pārliecināts, ka kļūda nenotiks. Ja kļūda tomēr notiks, programma avarēs. Izmantojiet ar piesardzību.

    // Izmantojiet tikai, ja 100% esat pārliecināts, ka funkcija neizraisīs kļūdu
    let result = try! processData(input: "always valid input")
    

Sistēma, kas balstīta uz do-catch, ir skaidrāka un drošāka kļūdu apstrādes metode salīdzinājumā ar tradicionālajām izņēmumu sistēmām citās valodās, jo tā prasa skaidri deklarēt funkcijas, kas var izraisīt kļūdas (throws), un skaidri apstrādāt šīs kļūdas izsaukuma laikā (try, do-catch).