web-dev-qa-db-fra.com

Gestion des erreurs dans Swift 3

Je migre mon code vers Swift 3 et je vois un tas des mêmes avertissements avec mes blocs do/try/catch. Je veux vérifier si une affectation ne retourne pas nil, puis affiche quelque chose sur la console si cela ne fonctionne pas. Le bloc catch indique qu'il "est inaccessible, car aucune erreur n'est renvoyée dans le bloc 'do'". Je souhaiterais intercepter toutes les erreurs avec un bloc.

let xmlString: String?
    do{
        //Warning for line below: "no calls to throwing function occurs within 'try' expression
        try xmlString = String(contentsOfURL: accessURL, encoding: String.Encoding.utf8)

        var xmlDict = XMLDictionaryParser.sharedInstance().dictionary(with: xmlString)
        if let models = xmlDict?["Cygnet"] {
            self.cygnets = models as! NSArray
        }

    //Warning for line below: "catch block is unreachable because no errors are thrown in 'do' block
    } catch {
        print("error getting xml string")
    }

Comment rédigerais-je un bloc catch try correct capable de gérer les erreurs d'attribution?

38
Bleep

Une façon de faire est de lancer ses propres erreurs en trouvant zéro.

Avec ce genre d'erreur de votre part:

enum MyError: Error {
    case FoundNil(String)
}

Vous pouvez écrire quelque chose comme ceci:

    do{
        let xmlString = try String(contentsOf: accessURL, encoding: String.Encoding.utf8)
        guard let xmlDict = XMLDictionaryParser.sharedInstance().dictionary(with: xmlString) else {
            throw MyError.FoundNil("xmlDict")
        }
        guard let models = xmlDict["Cygnet"] as? NSArray else {
            throw MyError.FoundNil("models")
        }
        self.cygnets = models
    } catch {
        print("error getting xml string: \(error)")
    }
61
OOPer