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