Sobes.tech
Junior

Kuidas avastada vigu Swiftis?

sobes.tech AI

Vastus AI-lt

Swiftisüsteem viga püüdmise põhineb võtmesõnadel throw, throws, try ja do-catch plokil.

  1. Funktsioonide, mis võivad vigu visata, deklaratsioon: Kasutatakse võtmesõna throws pärast funktsiooni parameetreid.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Visatakse viga
        }
        // ... andmete töötlemise loogika ...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Processed: \(input)"
    }
    
  2. Funktsioonide, mis võivad vigu visata, kutsumine: Kasutatakse võtmesõna try.

    do { // Vigade töötlemise plokk
        let result = try processData(input: "valid data")
        print(result) // "Processed: valid data"
    } catch { // Vigade püüdmine
        print("An error occurred: \(error)")
    }
    
  3. Spetsiifiliste vigatüüpide püüdmine: catch plokis saab määrata konkreetse vea tüübi.

    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 { // Kõikide teiste vigade püüdmine
        print("An unexpected error occurred: \(error)")
    }
    
  4. defer plokk: Käivitatakse otse enne praegusest vahemikust väljumist, olenemata sellest, kas toimus erind või mitte. Sageli kasutatakse ressursside puhastamiseks.

    func openFile(_ filename: String) throws -> String {
        // Oletame, et see avab faili ja tagastab selle sisu
        print("Opening file \(filename)")
        // ... avamise loogika ...
    
        defer {
            // See kood käivitatakse enne funktsioonist väljumist,
            // isegi kui toimub viga
            print("Closing file \(filename)")
        }
    
        // ... faili töötlemine ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Visatakse viga
        }
    
        return "File content"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Error handling file: \(error)")
    }
    
  5. Valikuline try?: Tagastab valikulise väärtuse. Kui funktsioon viskab vea, try? tagastab nil.

    let processedResult = try? processData(input: "") // processedResult on nil
    let validResult = try? processData(input: "abc") // validResult on valikulise String väärtusega "Processed: abc"
    
  6. Sunni try!: Kasutatakse, kui olete kindel, et viga ei toimu. Kui viga siiski toimub, lõpetab rakendus töö. Kasutage ettevaatusega.

    // Kasutage ainult, kui olete 100% kindel, et funktsioon ei viska viga
    let result = try! processData(input: "always valid input")
    

do-catch süsteemil põhinev viga töötlemise süsteem on selgem ja turvalisem kui traditsioonilised erandid teistes keeltes, kuna see nõuab funktsioonide selget deklaratsiooni, mis võivad vigu visata (throws), ning nende vigade selget töötlemist väljakutsel (try, do-catch).