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.
-
Deklaracija funkcija koje mogu da bace grešku: Koristi se ključna reč
throwsnakon 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)" } -
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)") } -
Hvatanje određenih tipova grešaka: U
catchbloku 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)") } -
deferblok: 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)") } -
Opcioni
try?: Vraća opcionalnu vrednost. Ako funkcija baci grešku,try?vraćanil.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" -
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).