Sobes.tech
Junior

Cum să detectezi erorile în Swift?

sobes.tech AI

Răspuns de la AI

În Swift, erorile sunt capturate folosind un sistem de gestionare a erorilor bazat pe utilizarea cuvintelor cheie throw, throws, try și blocul do-catch.

  1. Declarația funcțiilor care pot arunca erori: Se folosește cuvântul cheie throws după parametrii funcției.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Aruncă o eroare
        }
        // ...logica de procesare a datelor...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Procesat: \(input)"
    }
    
  2. Apelarea funcțiilor care pot arunca erori: Se folosește cuvântul cheie try.

    do { // Bloc de gestionare a erorilor
        let result = try processData(input: "date valide")
        print(result) // "Procesat: date valide"
    } catch { // Bloc de captare a erorilor
        print("A apărut o eroare: \(error)")
    }
    
  3. Captarea tipurilor specifice de erori: În blocul catch se poate indica un tip specific de eroare pentru captare.

    do {
        let result = try processData(input: "")
        print(result)
    } catch DataError.emptyData {
        print("Datele sunt goale, vă rugăm să furnizați o intrare.")
    } catch DataError.invalidFormat {
        print("Formatul datelor este invalid.")
    } catch { // Captarea oricăror alte erori
        print("A apărut o eroare neașteptată: \(error)")
    }
    
  4. Blocul defer: Se execută imediat înainte de a ieși din scopul curent, indiferent dacă a avut loc o eroare sau nu. Este adesea folosit pentru eliberarea resurselor.

    func openFile(_ filename: String) throws -> String {
        // Presupunem că deschide un fișier și returnează conținutul său
        print("Deschidere fișier \(filename)")
        // ... logica de deschidere ...
    
        defer {
            // Acest cod va fi executat înainte de a ieși din funcție,
            // chiar dacă apare o eroare
            print("Închiderea fișierului \(filename)")
        }
    
        // ... procesarea fișierului ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Aruncă o eroare
        }
    
        return "Conținutul fișierului"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Eroare la gestionarea fișierului: \(error)")
    }
    
  5. try? opțional: Returnează o valoare opțională. Dacă funcția aruncă o eroare, try? returnează nil.

    let processedResult = try? processData(input: "") // processedResult va fi nil
    let validResult = try? processData(input: "abc") // validResult va fi un String opțional cu valoarea "Processed: abc"
    
  6. try! forțat: Se folosește atunci când ești sigur că nu va apărea o eroare. Dacă totuși apare, aplicația se va încheia brusc. Folosește cu precauție.

    // Folosește doar dacă ești 100% sigur că funcția nu va arunca o eroare
    let result = try! processData(input: "întotdeauna intrare validă")
    

Sistemul bazat pe do-catch este o modalitate mai explicită și mai sigură de a trata erorile comparativ cu excepțiile tradiționale din alte limbaje, deoarece necesită declararea explicită a funcțiilor care pot arunca erori (throws) și tratarea explicită a acestor erori la apel (try, do-catch).