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

  1. Errors en Swift: Swift utilitza el protocol Error per representar errors.
  2. Llançament d'Errors: Utilitzem la paraula clau throw per llançar errors.
  3. Captura d'Errors: Utilitzem les estructures do, try, catch per capturar i manejar errors.
  4. Errors Propagats: Els errors poden ser propagats a través de funcions utilitzant la paraula clau throws.
  5. 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.

enum FileError: Error {
    case fileNotFound
    case unreadable
    case encodingFailed
}

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.

func processFile(at path: String) throws {
    try readFile(at: path)
    // Processar el fitxer
}

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.

© Copyright 2024. Tots els drets reservats