web-dev-qa-db-fra.com

Comment obtenir le message d'erreur dans Swift 2.0?

J'ai beaucoup utilisé cette méthode dans Swift 1.2: NSURLConnection.sendSynchronousRequest(:_:_:_) mais celle-ci est apparemment déconseillée dans iOS9. Elle fonctionne toujours mais maintenant elle utilise le nouveau Swift 2.0 Gestion des erreurs et je ne sais pas comment j'obtiendrai le message d'erreur en cas d'échec, par exemple si le temps est écoulé.

Je sais que je dois le mettre dans un do-catch et dire ensuite essayer avant la metho mais je ne sais pas comment attraper le message d'erreur.

do {
    let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
    return data 
}
catch _ {
    return nil
}

Avant, j'utilisais NSError puis sa propriété de description, mais maintenant je n'ai aucune idée.

19
Arbitur

Utilisez la variable automatique error, et vous pouvez la convertir en NSError si vous le souhaitez:

catch {
    let nsError = error as NSError
    print(nsError.localizedDescription)
}
36
rshev

Vous pouvez maintenant lancer n'importe quel objet héritant de ErrorType et fournir une gestion personnalisée dans la phrase catch. Vous pouvez également convertir l'erreur en NSError pour accéder à localizedDescription pour gérer les erreurs de tiers.

La conversion d'une énumération ErrorType produira une NSError avec domain égal au nom de l'énumération, code égal à la valeur de l'énumération et une génération automatique localizedDescription au format suivant:

L'opération n'a pas pu être terminée. (CODE d'erreur DOMAINE.)

Par exemple, le code suivant:

enum AwfulError: ErrorType {
    case Bad
    case Worse
    case Terrible
}

func throwingFunction() throws {
    throw AwfulError.Worse
}

do {
    try throwingFunction()
}
catch AwfulError.Bad {
    print("Bad error")
}
catch let error as NSError {
    print(error.localizedDescription)
}

Imprime

L'opération n'a pas pu être terminée. (Erreur AwfulError 1.)

4
redent84

Malgré le titre de la question spécifiant Swift 2, cette réponse est pour Swift 3.

Comme le souligne @ redent84, puisque Swift 2 un objet Error peut être un objet fait maison. Voici une méthode que j'ai écrite pour analyser et imprimer l'objet d'erreur par défaut disponible dans une instruction "catch" qui ne spécifie aucun type d'erreur spécifique:

   // Method to print an unknown Error type object to the system output.
   static func printCaughtError(_ unknownError : Error) {
      let objectDescription = String(describing: unknownError)
      let localizedDescription = unknownError.localizedDescription
      if localizedDescription != "" {
         if localizedDescription.contains(objectDescription) {
            print(localizedDescription)
            return
         }
         if !objectDescription.contains(localizedDescription) {
            print(objectDescription + ": " + localizedDescription)
            return
         }
      }
      print(objectDescription)
   }

Ensuite, vous pouvez l'appeler comme ceci:

    catch {
       printCaughtError(error)
    }
1
RenniePet