Générer votre propre code d'Erreur dans swift 3
Ce que je suis en train de réaliser est de procéder à un URLSession
demande swift 3. Je suis en effectuant cette action dans une fonction distincte (pour ne pas écrire le code séparément pour GET et POST) et le retour de l' URLSessionDataTask
et de la manipulation de la réussite et de l'échec dans les fermetures. Un peu comme ce-
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 souhaitez générer une erreur en utilisant le code de réponse et de retour cette Erreur à gérer où cette fonction est appelée à partir d'.
Quelqu'un peut-il me dire comment aller à ce sujet? Ou n'est-ce pas le "Swift" de chemin à faire sur la gestion de telles situations?
- Essayez d'utiliser
NSError
au lieu deError
dans la déclaration (var errorTemp = NSError(...)
) - Cela résout le problème, mais j'ai pensé swift 3 ne souhaitez pas continuer avec l'utilisation de NS?
- Il n'en développement iOS. Pour pure développement rapide, vous devez créer votre propre erreur instance en conformant le
Error
protocole - Votre solution ne résoudra pas le problème, n'hésitez pas à l'ajouter comme une réponse afin que je puisse l'accepter!
Vous devez vous connecter pour publier un commentaire.
Dans votre cas, l'erreur est que vous essayez de générer un
Error
instance.Error
dans Swift 3 est un protocole qui peut être utilisé pour définir un message d'erreur personnalisé. Cette fonctionnalité est particulièrement pure Swift applications de s'exécuter sur différents OS.Dans le développement iOS du
NSError
classe est toujours disponible et il est conforme àError
protocole.Donc, si votre seul but est de propager ce code d'erreur, vous pouvez facilement remplacer
avec
Sinon vérifier la Sandeep Bhandari's réponse sur la façon de créer un type d'erreur
Error cannot be created because it has no accessible initializers
.Error
, maisNSError
. De cours à l'aide deError
renvoie une erreur.Vous pouvez créer un protocole, conformément à la Swift
LocalizedError
protocole, avec ces valeurs:Ensuite, cela nous permet de créer de béton erreurs comme:
Vous pouvez créer des énumérations de traiter avec des erreurs 🙂
et puis créer une méthode à l'intérieur d'enum pour recevoir le code de réponse http et le retour de l'erreur correspondante en retour 🙂
Enfin mise à jour de votre défaillance du bloc d'accepter seul paramètre de type RikhError 🙂
J'ai un tutoriel détaillé sur la façon de restructurer traditionnel Objective - C en fonction Orientée Objet modèle de réseau moderne Protocole Orienté modèle à l'aide de Swift3 ici https://learnwithmehere.blogspot.in Ont un coup d'oeil 🙂
Espère que cela aide 🙂
Vous devez utiliser NSError objet.
let error = NSError(domain:"", code:401, userInfo:[ NSLocalizedDescriptionKey: "Invalid access token"])
Puis jeté NSError pour objet d'Erreur
Mettre En Œuvre LocalizedError:
Noter que la simple mise en œuvre d'Erreur, par exemple, comme décrit dans l'une des réponses, ne va pas (au moins dans Swift 3), et en appelant localizedDescription entraînera la chaîne de "L'opération n'a pas pu être terminée. (.StringError erreur 1.)"
struct StringError : LocalizedError { public let errorDescription: String? }
, et que tout simplement l'utiliser commeStringError(errorDescription: "some message")
Détails
Solution de l'organisation des erreurs dans une application
Utilisation
créer un NSError objet et le transtypage il d'une Erreur ,d'afficher n'importe où
Je sais que vous avez déjà satisfait d'une réponse, mais si vous êtes intéressé à connaître la bonne approche, alors ce pourrait être utile pour vous.
Je préfère ne pas mélanger les http de réponse code d'erreur avec le code d'erreur dans l'erreur de l'objet (confus? s'il vous plaît continuer la lecture un peu...).
La réponse http codes sont des codes d'erreur standard à propos d'une réponse http définition générique des situations quand on a reçu la réponse et varie de 1xx à 5xx ( e.g 200 OK, 408 Request timed out,504 Gateway timeout etc - http://www.restapitutorial.com/httpstatuscodes.html )
Le code d'erreur dans un NSError objet fournit très identification spécifique à la nature de l'erreur de l'objet décrit, pour un domaine particulier d'application/produits logiciels/. Par exemple, votre application peut utiliser 1000 pour "Désolé, Vous ne pouvez pas mettre à jour cet enregistrement plusieurs fois dans une journée", ou dites 1001 pour "Vous devez rôle de gestionnaire pour accéder à cette ressource",... ce qui est spécifique à votre domaine/la logique de l'application.
Pour une très petite application, parfois, ces deux concepts sont fusionnés. Mais ils sont totalement différentes comme vous pouvez le voir, et très important & utile de conception et de travailler avec de gros logiciels.
Donc, il peut y avoir deux techniques pour manipuler le code de la meilleure façon:
1. Le rappel d'achèvement permettra d'effectuer toutes les vérifications
2. Votre méthode décide de la réussite et de la situation d'erreur et invoque ensuite le correspondant de rappel
Heureux de codage 🙂