Après avoir installé Xcode 7 beta et converti mon code swift en Swift 2, j'ai eu un problème avec le code que je ne peux pas comprendre. Je sais que Swift 2 est nouveau, donc je cherche et je comprends car il n'y a rien à ce sujet, je devrais écrire une question.
Voici l'erreur:
L'appel peut lancer, mais il n'est pas marqué avec 'try' et l'erreur n'est pas gérée
Code:
func deleteAccountDetail(){
let entityDescription = NSEntityDescription.entityForName("AccountDetail", inManagedObjectContext: Context!)
let request = NSFetchRequest()
request.entity = entityDescription
//The Line Below is where i expect the error
let fetchedEntities = self.Context!.executeFetchRequest(request) as! [AccountDetail]
for entity in fetchedEntities {
self.Context!.deleteObject(entity)
}
do {
try self.Context!.save()
} catch _ {
}
}
Instantané:
try
mot - clé à l'appel de fonction et de déclarer cette fonction commefunc deleteAccountDetail() throw
. Ou si vous avez garanti que la fonction ne lancera pas pour l'entrée donnée, vous pouvez utilisertry!
.deinit()
appels implicites pour effectuer le nettoyage (c'est-à-dire RAII), ou parfois utiliserdefer
pour effectuer un nettoyage ad hoc. Voir exceptionsafecode.com pour plus d'informations (il parle de C ++, mais les principes de base s'appliquent également aux exceptions Swift.)Lorsque vous appelez une fonction déclarée avec
throws
dans Swift, vous devez annoter le site d'appel de fonction avectry
outry!
. Par exemple, étant donné une fonction de lancement:cette fonction peut être appelée comme:
Ici, nous annotons l'appel avec
try
, qui appelle le lecteur que cette fonction peut lever une exception et que les lignes de code suivantes peuvent ne pas être exécutées. Nous avons aussi annoter cette fonction avecthrows
, parce que cette fonction pourrait lancer une exception (quandwillOnlyThrowIfTrue()
lancers francs, puisfoo
sera automatiquement réémettre l'exception vers le haut.Si vous voulez appeler une fonction qui est déclarée comme pouvant être lancée, mais dont vous savez qu'elle ne la lancera pas dans votre cas parce que vous lui donnez une entrée correcte, vous pouvez utiliser
try!
.De cette façon, lorsque vous garantissez que le code ne sera pas lancé, vous n'avez pas à insérer de code standard supplémentaire pour désactiver la propagation des exceptions.
try!
est appliqué à l'exécution: si vous utiliseztry!
et que la fonction finit par lancer, l'exécution de votre programme se terminera par une erreur d'exécution.La plupart des codes de gestion d'exceptions devraient ressembler à ce qui précède: soit vous propagez simplement les exceptions vers le haut lorsqu'elles se produisent, soit vous définissez des conditions telles que les exceptions éventuelles sont exclues. Tout nettoyage des autres ressources de votre code doit se faire via la destruction d'objets (ie
deinit()
), ou parfois via ledefer
code ed.Si, pour une raison quelconque, vous avez du code de nettoyage qui doit s'exécuter mais qui n'est pas
deinit()
fonction, vous pouvez utiliserdefer
.La plupart du code qui traite les exceptions les fait simplement se propager vers le haut aux appelants, effectuant le nettoyage en cours de route via
deinit()
oudefer
. C'est parce que la plupart du code ne sait pas quoi faire avec les erreurs; il sait ce qui s'est mal passé, mais il n'a pas suffisamment d'informations sur ce qu'un code de niveau supérieur essaie de faire pour savoir quoi faire à propos de l'erreur. Il ne sait pas si la présentation d'une boîte de dialogue à l'utilisateur est appropriée, ou s'il doit réessayer, ou si quelque chose d'autre est approprié.Cependant, le code de niveau supérieur doit savoir exactement quoi faire en cas d'erreur. Ainsi, les exceptions permettent à des erreurs spécifiques de remonter de l'endroit où elles se produisent initialement à l'endroit où elles peuvent être traitées.
La gestion des exceptions se fait via
catch
instructions.Vous pouvez avoir plusieurs instructions catch, chacune interceptant un type d'exception différent.
Pour plus d'informations sur les bonnes pratiques avec exceptions, consultez http://exceptionsafecode.com/ . Il est spécifiquement destiné au C ++, mais après avoir examiné le modèle d'exception Swift, je pense que les bases s'appliquent également à Swift.
Pour plus de détails sur la syntaxe Swift et le modèle de gestion des erreurs, consultez le livre The Swift Programming Language (Swift 2 Prerelease) .
la source
Invalid conversion from throwing function of type '() throws -> _' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void'
NSData?, NSURLResponse?, NSError?
comme arguments, mais vous lui donnez une fonction qui ne prend aucun argument.