39 votes

Gestion des erreurs dans Swift 3

Je suis en train de migrer 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 renvoie pas nil et ensuite imprimer quelque chose sur la console si cela ne fonctionne pas. Le bloc catch dit qu'il "est inaccessible car aucune erreur n'est déclenchée dans le bloc 'do'". Je voudrais attraper toutes les erreurs avec un seul bloc catch.

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 puis-je écrire un bloc try catch correct qui gère les erreurs d'affectation ?

61voto

OOPer Points 33473

Une façon de faire est de lancer vos propres erreurs lorsque vous trouvez nil.

En ayant cette sorte d'erreur de votre part :

enum MyError: Error {
    case FoundNil(String)
}

Vous pouvez écrire quelque chose comme ça :

    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)")
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X