115 votes

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

Ce que je suis en train de réaliser est de procéder à un URLSession la demande en 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?

121voto

Luca D'Alberti Points 3321

Dans votre cas, l'erreur est que vous essayez de générer un Error de l'instance. Error en 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 d'iOS l' NSError classe est toujours disponible et il est conforme à l' Error protocole.

Donc, si votre seul but est 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érifier la Sandeep Bhandari's réponse sur la façon de créer un type d'erreur

86voto

Harry Bloom Points 1198

Vous pouvez créer un protocole, conforme au protocole Swift LocalizedError , avec les valeurs suivantes:

 protocol OurErrorProtocol: LocalizedError {

    var title: String? { get }
    var code: Int { get }
}
 

Cela nous permet ensuite de créer des erreurs concrètes comme ceci:

 struct CustomError: OurErrorProtocol {

    var title: String?
    var code: Int
    var errorDescription: String? { return _description }
    var failureReason: String? { return _description }

    private var _description: String

    init(title: String?, description: String, code: Int) {
        self.title = title ?? "Error"
        self._description = description
        self.code = code
    }
}
 

74voto

Ahmed Lotfy Points 1478

Vous devez utiliser l'objet NSError.

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

Puis convertissez NSError en objet Error

61voto

Sandeep Bhandari Points 10663

Vous pouvez créer des énumérations de traiter avec des erreurs :)

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

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 :)

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 la 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 jetez un oeil :)

Espérons que cela aide :)

18voto

prewett Points 265

Implémentez LocalizedError:

 struct StringError : LocalizedError
{
    var errorDescription: String? { return mMsg }
    var failureReason: String? { return mMsg }
    var recoverySuggestion: String? { return "" }
    var helpAnchor: String? { return "" }

    private var mMsg : String

    init(_ description: String)
    {
        mMsg = description
    }
}
 

Notez que la simple implémentation de Error, par exemple, comme décrit dans l’une des réponses, échouera (du moins dans Swift 3) et que l’appel de localizedDescription entraînera la chaîne "L’opération n’a pas pu aboutir. (Erreur 1.StringError 1.) "

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