Mise à jour du 9 juin 2015 - Très important
Swift 2.0 est livré avec try
, throw
y catch
et le plus excitant est le suivant :
Swift traduit automatiquement les méthodes Objective-C qui produisent des erreurs en méthodes qui lancent une erreur conformément à la fonctionnalité native de traitement des erreurs de Swift.
Note : Les méthodes qui consomment des erreurs, telles que les méthodes déléguées ou les méthodes qui prennent un gestionnaire d'achèvement avec un argument d'objet NSError, ne sont pas deviennent pas des méthodes qui lancent lorsqu'elles sont importées par Swift.
Extrait de : Apple Inc. "Using Swift with Cocoa and Objective-C (Swift 2 Prerelease)" iBooks.
Exemple : (extrait du livre)
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *URL = [NSURL fileURLWithPath:@"/path/to/file"];
NSError *error = nil;
BOOL success = [fileManager removeItemAtURL:URL error:&error];
if (!success && error){
NSLog(@"Error: %@", error.domain);
}
L'équivalent en swift sera :
let fileManager = NSFileManager.defaultManager()
let URL = NSURL.fileURLWithPath("path/to/file")
do {
try fileManager.removeItemAtURL(URL)
} catch let error as NSError {
print ("Error: \(error.domain)")
}
Lancer une erreur :
*errorPtr = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCannotOpenFile userInfo: nil]
sera automatiquement transmise à l'appelant :
throw NSError(domain: NSURLErrorDomain, code: NSURLErrorCannotOpenFile, userInfo: nil)
D'après les livres d'Apple, The Swift Programming Language, il semble que les erreurs devraient être gérées à l'aide d'enum.
Voici un exemple tiré du livre.
enum ServerResponse {
case Result(String, String)
case Error(String)
}
let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")
switch success {
case let .Result(sunrise, sunset):
let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
case let .Error(error):
let serverResponse = "Failure... \(error)"
}
De : Apple Inc. "Le langage de programmation Swift". iBooks. <a href="https://itun.es/br/jEUH0.l" rel="nofollow">https://itun.es/br/jEUH0.l</a>
Mise à jour
Tiré des livres de nouvelles d'Apple, "Using Swift with Cocoa and Objective-C". Les exceptions d'exécution ne se produisent pas avec les langages Swift, c'est pourquoi vous n'avez pas try-catch. Au lieu de cela, vous utilisez Chaînage optionnel .
Voici un extrait du livre :
Par exemple, dans la liste de codes ci-dessous, les première et deuxième lignes ne sont pas exécutées parce qu'il n'y a pas d'autre solution. ne sont pas exécutées car la propriété length et la méthode characterAtIndex : n'existent pas sur un objet NSDate. La constante myLength est est déduite comme étant un Int optionnel et est définie à nil. Vous pouvez également utiliser un énoncé if-let pour déballer conditionnellement le résultat d'une méthode que l'objet l'objet peut ne pas répondre, comme le montre la ligne trois
let myLength = myObject.length?
let myChar = myObject.characterAtIndex?(5)
if let fifthCharacter = myObject.characterAtIndex(5) {
println("Found \(fifthCharacter) at index 5")
}
Extrait de : Apple Inc. "Using Swift with Cocoa and Objective-C." iBooks. <a href="https://itun.es/br/1u3-0.l" rel="nofollow">https://itun.es/br/1u3-0.l</a>
Les livres vous encouragent également à utiliser le modèle d'erreur cacao d'Objective-C (NSError Object).
Les rapports d'erreur en Swift suivent le même modèle qu'en Objective-C, avec l'avantage supplémentaire d'offrir des valeurs de retour optionnelles. optionnelles. Dans le cas le plus simple, vous retournez une valeur Bool de la fonction pour indiquer si elle a réussi ou non. Lorsque vous devez signaler la raison de l'erreur, vous pouvez ajouter à la fonction un paramètre de sortie NSError de type NSError. NSError de type NSErrorPointer. Ce type est à peu près équivalent au NSError ** de l'Objective-C, avec une sécurité mémoire supplémentaire et un typage optionnel. Vous pouvez utiliser le préfixe & pour passer une référence à une NSError optionnelle. une référence à un type NSError optionnel en tant qu'objet NSErrorPointer, comme le montre l'exemple suivant comme le montre le code ci-dessous.
var writeError : NSError?
let written = myString.writeToFile(path, atomically: false,
encoding: NSUTF8StringEncoding,
error: &writeError)
if !written {
if let error = writeError {
println("write failure: \(error.localizedDescription)")
}
}
Extrait de : Apple Inc. "Using Swift with Cocoa and Objective-C." iBooks. <a href="https://itun.es/br/1u3-0.l" rel="nofollow">https://itun.es/br/1u3-0.l</a>
1 votes
J'ai trouvé des messages d'erreur comme avec Obj-C :o
15 votes
@Arbitur la bonne vieille méthode segfault ?
0 votes
J'ai créé un NSTimer en Swift et lorsque j'ai mal orthographié la fonction, il s'est écrasé et m'a donné une erreur disant qu'il ne pouvait pas trouver la méthode :)
3 votes
Vous pouvez ajouter la prise en charge de try-catch pour Swift en suivant les instructions de cet article : medium.com/@_willfalcon/adding-try-catch-to-swift-71ab27bcb5b8
0 votes
@peko Comment gérer un segfault en Swift ? Je ne pense pas que ce soit possible pour l'instant, ce qui rend malheureusement certaines erreurs irrécupérables.