La gestió d'errors és una part fonamental de qualsevol llenguatge de programació modern, i Swift no és una excepció. En aquest tema, aprendrem com manejar errors de manera efectiva en Swift, utilitzant les eines que el llenguatge proporciona per assegurar-nos que les nostres aplicacions siguin robustes i fiables.
Conceptes Clau
- Errors en Swift: Swift utilitza el protocol
Error
per representar errors. - Llançament d'Errors: Utilitzem la paraula clau
throw
per llançar errors. - Captura d'Errors: Utilitzem les estructures
do
,try
,catch
per capturar i manejar errors. - Errors Propagats: Els errors poden ser propagats a través de funcions utilitzant la paraula clau
throws
. - Errors Personalitzats: Podem definir els nostres propis tipus d'errors.
Errors en Swift
En Swift, els errors es representen mitjançant tipus que conformen el protocol Error
. Aquest protocol no requereix cap propietat o mètode específic, el que significa que qualsevol tipus que conformi aquest protocol pot ser utilitzat com a error.
Llançament d'Errors
Per llançar un error, utilitzem la paraula clau throw
seguida de l'error que volem llançar.
func readFile(at path: String) throws { let fileExists = false // Simulació if !fileExists { throw FileError.fileNotFound } // Codi per llegir el fitxer }
Captura d'Errors
Per capturar errors, utilitzem una estructura do-catch
. Dins del bloc do
, utilitzem la paraula clau try
per indicar que una funció pot llançar un error.
do { try readFile(at: "path/to/file") } catch FileError.fileNotFound { print("El fitxer no s'ha trobat.") } catch FileError.unreadable { print("El fitxer no es pot llegir.") } catch { print("Un error inesperat ha ocorregut: \(error).") }
Errors Propagats
Les funcions que poden llançar errors han de ser marcades amb la paraula clau throws
. Això indica que la funció pot llançar un error i que l'error ha de ser manejat per la funció que la crida.
Errors Personalitzats
Podem definir els nostres propis tipus d'errors per proporcionar informació més detallada sobre els errors que poden ocórrer en la nostra aplicació.
enum NetworkError: Error { case badURL case requestFailed(description: String) case unknown } func fetchData(from urlString: String) throws { guard let url = URL(string: urlString) else { throw NetworkError.badURL } // Simulació d'una fallada en la sol·licitud let requestSuccess = false if !requestSuccess { throw NetworkError.requestFailed(description: "La sol·licitud ha fallat.") } // Codi per obtenir dades }
Exercicis Pràctics
Exercici 1: Llançament i Captura d'Errors
Escriu una funció que llegeixi el contingut d'un fitxer i llança un error si el fitxer no existeix. Captura l'error i imprimeix un missatge adequat.
enum FileError: Error { case fileNotFound } func readFile(at path: String) throws -> String { let fileExists = false // Simulació if !fileExists { throw FileError.fileNotFound } return "Contingut del fitxer" } do { let content = try readFile(at: "path/to/file") print(content) } catch FileError.fileNotFound { print("El fitxer no s'ha trobat.") } catch { print("Un error inesperat ha ocorregut: \(error).") }
Exercici 2: Errors Personalitzats
Defineix un tipus d'error personalitzat per gestionar errors de xarxa i escriu una funció que simuli una sol·licitud de xarxa. Captura i maneja els errors adequadament.
enum NetworkError: Error { case badURL case requestFailed(description: String) case unknown } func fetchData(from urlString: String) throws { guard let url = URL(string: urlString) else { throw NetworkError.badURL } // Simulació d'una fallada en la sol·licitud let requestSuccess = false if !requestSuccess { throw NetworkError.requestFailed(description: "La sol·licitud ha fallat.") } // Codi per obtenir dades } do { try fetchData(from: "invalid-url") } catch NetworkError.badURL { print("La URL és incorrecta.") } catch NetworkError.requestFailed(let description) { print("Error en la sol·licitud: \(description).") } catch { print("Un error inesperat ha ocorregut: \(error).") }
Conclusió
La gestió d'errors en Swift és una eina poderosa que ens permet escriure codi més segur i robust. Hem après com llançar, capturar i propagar errors, així com definir els nostres propis tipus d'errors personalitzats. Amb aquests coneixements, estem millor preparats per manejar situacions inesperades en les nostres aplicacions.
En el següent tema, explorarem les funcions i closures, que ens permetran escriure codi més modular i reutilitzable.
Curs de Programació en Swift
Mòdul 1: Introducció a Swift
- Introducció a Swift
- Configuració de l'Entorn de Desenvolupament
- El Teu Primer Programa en Swift
- Sintaxi i Estructura Bàsica
- Variables i Constants
- Tipus de Dades
Mòdul 2: Flux de Control
Mòdul 3: Funcions i Closures
- Definició i Crida de Funcions
- Paràmetres de Funció i Valors de Retorn
- Closures
- Funcions d'Ordre Superior
Mòdul 4: Programació Orientada a Objectes
Mòdul 5: Swift Avançat
Mòdul 6: Swift i Desenvolupament iOS
- Introducció al Desenvolupament iOS
- Conceptes Bàsics de UIKit
- Storyboards i Interface Builder
- Xarxes en Swift
- Core Data
- Conceptes Bàsics de SwiftUI