Générez votre propre code d’erreur dans swift 3

Ce que j’essaie de faire, c’est d’exécuter une requête URLSession dans swift 3. URLSession cette action dans une fonction distincte (afin de ne pas écrire le code séparément pour GET et POST) et de renvoyer URLSessionDataTask et de gérer le succès et l’échec des fermetures . Sorte de comme ça-

 let task = URLSession.shared.dataTask(with: request) { (data, uRLResponse, responseError) in DispatchQueue.main.async { var httpResponse = uRLResponse as! HTTPURLResponse if responseError != nil && httpResponse.statusCode == 200{ successHandler(data!) }else{ if(responseError == nil){ //Trying to achieve something like below 2 lines //Following line throws an error soo its not possible //var errorTemp = Error(domain:"", code:httpResponse.statusCode, userInfo:nil) //failureHandler(errorTemp) }else{ failureHandler(responseError!) } } } } 

Je ne souhaite pas gérer la condition d’erreur dans cette fonction et je souhaite générer une erreur en utilisant le code de réponse et renvoyer cette erreur pour la gérer partout où cette fonction est appelée. Quelqu’un peut-il me dire comment s’y prendre? Ou n’est-ce pas la manière “rapide” de gérer de telles situations?

Dans votre cas, l’erreur est que vous essayez de générer une instance d’ Error . Error dans Swift 3 est un protocole qui peut être utilisé pour définir une erreur personnalisée. Cette fonctionnalité est particulièrement destinée aux applications Swift pures à exécuter sur des systèmes d’exploitation différents.

Dans le développement iOS, la classe NSError est toujours disponible et conforme au protocole d’ Error .

Donc, si votre but est seulement de propager ce code d’erreur, vous pouvez facilement remplacer

 var errorTemp = Error(domain:"", code:httpResponse.statusCode, userInfo:nil) 

avec

 var errorTemp = NSError(domain:"", code:httpResponse.statusCode, userInfo:nil) 

Sinon, vérifiez la réponse de Sandeep Bhandari sur la façon de créer un type d’erreur personnalisé

Vous pouvez créer un protocole conforme au protocole Swift LocalizedError avec ces valeurs:

 protocol OurErrorProtocol: LocalizedError { var title: Ssortingng? { get } var code: Int { get } } 

Cela nous permet alors de créer des erreurs concrètes comme celles-ci:

 struct CustomError: OurErrorProtocol { var title: Ssortingng? var code: Int var errorDescription: Ssortingng? { return _description } var failureReason: Ssortingng? { return _description } private var _description: Ssortingng init(title: Ssortingng?, description: Ssortingng, code: Int) { self.title = title ?? "Error" self._description = description self.code = code } } 

Vous pouvez créer des énumérations pour gérer les erreurs 🙂

 enum RikhError: Error { case unknownError case connectionError case invalidCredentials case invalidRequest case notFound case invalidResponse case serverError case serverUnavailable case timeOut case unsuppotedURL } 

puis créez une méthode dans enum pour recevoir le code de réponse http et renvoyer l’erreur correspondante en retour 🙂

 static func checkErrorCode(_ errorCode: Int) -> RikhError { switch errorCode { case 400: return .invalidRequest case 401: return .invalidCredentials case 404: return .notFound //bla bla bla default: return .unknownError } } 

Enfin, mettez à jour votre bloc d’échec pour accepter le paramètre unique de type RikhError 🙂

J’ai un tutoriel détaillé sur la restructuration du modèle de réseau orienté object basé sur Objective – C vers un modèle orienté protocole moderne en utilisant Swift3 ici https://learnwithmehere.blogspot.in

J’espère que cela aide 🙂

Vous devez utiliser l’object NSError.

let error = NSError(domain:"", code:401, userInfo:[ NSLocalizedDescriptionKey: "Invaild access token"])

Ensuite, convertissez NSError en object Error

Implémenter LocalizedError:

 struct SsortingngError : LocalizedError { var errorDescription: Ssortingng? { return mMsg } var failureReason: Ssortingng? { return mMsg } var recoverySuggestion: Ssortingng? { return "" } var helpAnchor: Ssortingng? { return "" } private var mMsg : Ssortingng init(_ description: Ssortingng) { mMsg = description } } 

Notez que l’implémentation d’une erreur, par exemple, comme décrit dans l’une des réponses, échouera (au moins dans Swift 3), et l’appel à localizedDescription entraînera la chaîne “L’opération n’a pas pu être terminée. (Erreur 1.SsortingngError 1.) ”

Je sais que vous êtes déjà satisfait d’une réponse, mais si vous êtes intéressé à connaître la bonne approche, cela pourrait vous être utile. Je préférerais ne pas mélanger le code d’erreur de réponse http avec le code d’erreur dans l’object d’erreur (confus? Continuez à lire un peu …).

Les codes de réponse http sont des codes d’erreur standard relatifs à une réponse http définissant des situations génériques lorsque la réponse est reçue et varie de 1xx à 5xx (par exemple, 200 OK, 408 Délai d’attente dépassé, 504 Délai d’expiration de la passerelle, etc. – http://www.restapitutorial.com/ httpstatuscodes.html )

Le code d’erreur d’un object NSError fournit une identification très spécifique au type d’erreur décrit par l’object pour un domaine particulier d’application / produit / logiciel. Par exemple, votre application peut utiliser 1000 pour “Désolé, vous ne pouvez pas mettre à jour cet enregistrement plus d’une fois par jour” ou dire 1001 pour “Vous avez besoin du rôle de responsable pour accéder à cette ressource” … spécifiques à votre domaine / application logique.

Pour une très petite application, ces deux concepts sont parfois fusionnés. Mais ils sont complètement différents comme vous pouvez le voir et très importants et utiles pour concevoir et travailler avec de gros logiciels.

Il existe donc deux techniques pour mieux gérer le code:

1. Le rappel d’achèvement effectuera toutes les vérifications

 completionHandler(data, httpResponse, responseError) 

2. Votre méthode décide du succès et de la situation d’erreur, puis appelle le rappel correspondant

 if nil == responseError { successCallback(data) } else { failureCallback(data, responseError) // failure can have data also for standard REST request/response APIs } 

Heureux codage 🙂