Sobes.tech
Junior

Kako otkriti greške u Swift-u?

sobes.tech АИ

Одговор од АИ

U Swift-u, greške se hvataju pomoću sistema za obradu grešaka zasnovanog na ključnim rečima throw, throws, try i bloku do-catch.

  1. Deklaracija funkcija koje mogu da bace grešku: Koristi se ključna reč throws nakon parametara funkcije.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Bacamo grešku
        }
        // ... logika obrade podataka ...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Obrađeno: \(input)"
    }
    
  2. Pozivanje funkcija koje mogu da bace grešku: Koristi se ključna reč try.

    do { // Blok za obradu grešaka
        let result = try processData(input: "valid data")
        print(result) // "Obrađeno: valid data"
    } catch { // Hvatanje grešaka
        print("Došlo je do greške: \(error)")
    }
    
  3. Hvatanje određenih tipova grešaka: U catch bloku može se navesti konkretan tip greške.

    do {
        let result = try processData(input: "")
        print(result)
    } catch DataError.emptyData {
        print("Podaci su prazni, molimo unesite ulaz.")
    } catch DataError.invalidFormat {
        print("Format podataka je nevažeći.")
    } catch { // Hvatanje svih ostalih grešaka
        print("Neplanirana greška: \(error)")
    }
    
  4. defer blok: Izvršava se neposredno pre izlaska iz trenutne oblasti, bez obzira da li je došlo do greške ili ne. Često se koristi za čišćenje resursa.

    func openFile(_ filename: String) throws -> String {
        // Pretpostavljamo da otvara fajl i vraća njegov sadržaj
        print("Otvaranje fajla: \(filename)")
        // ... logika otvaranja ...
    
        defer {
            // Ovaj kod će se izvršiti pre izlaska iz funkcije,
            // čak i ako dođe do greške
            print("Zatvaranje fajla: \(filename)")
        }
    
        // ... obrada fajla ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Bacamo grešku
        }
    
        return "Sadržaj fajla"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Greška pri rukovanju fajlom: \(error)")
    }
    
  5. Opcioni try?: Vraća opcionalnu vrednost. Ako funkcija baci grešku, try? vraća nil.

    let processedResult = try? processData(input: "") // processedResult će biti nil
    let validResult = try? processData(input: "abc") // validResult će biti opcionalni String sa vrednošću "Processed: abc"
    
  6. Prisilni try!: Koristi se kada ste sigurni da greška neće nastati. Ako ipak nastane, aplikacija će se neočekivano srušiti. Koristite sa oprezom.

    // Koristite samo ako ste 100% sigurni da funkcija neće baciti grešku
    let result = try! processData(input: "uvek važeći unos")
    

Sistem zasnovan na do-catch je jasniji i sigurniji način za obradu grešaka u poređenju sa tradicionalnim izuzecima u drugim jezicima, jer zahteva eksplicitno deklarisanje funkcija koje mogu da bacaju greške (throws) i eksplicitnu obradu tih grešaka pri pozivu (try, do-catch).