2015-10-02 3 views
1

HI je suis un peu confus sur la façon de transférer la gestion des erreurs if_else pour essayer de rattraper avec succès.essayer try catch swift 2

Voici mon code.

let error : NSError? 
if(managedObjectContext!.save()) { 
    NSNotificationCenter.defaultCenter().postNotificationName("updateUndoState", object: nil)  
    if error != nil { 
     print(error?.localizedDescription) 
    } 
} 
else { 
    print("abort") 
    abort() 
} 

et maintenant je me suis converti à 2.0 rapide comme celui-ci

do { 
    try managedObjectContext!.save() 
} 
catch { 
    NSNotificationCenter.defaultCenter().postNotificationName("updateUndoState", object: nil) 
    print((error as NSError).localizedDescription) 
} 

Je suis confus au sujet où imprimer et faire avorter la fonction abort()

Toute idée ~? Merci beaucoup

+0

Dans votre code original, d'où vient l'erreur? Cela ne vient pas de 'save()'. – Sulthan

+0

@Sulthan merci pour votre rappeler. Cependant, après avoir changé mon code, il se produit ce qui suit: Variable 'error' utilisée avant d'être initialisée –

+0

@Sulthan - Non, le 'error' _is_ est lancé par' save() '. Quand vous avez 'catch 'sans un' let', il utilise automatiquement 'error' comme référence à l'erreur lancée. – Rob

Répondre

1

Réécriture votre code pour travailler le même que votre code d'origine

do { 
    try managedObjectContext!.save() 

    //this happens when save did pass 
    NSNotificationCenter.defaultCenter().postNotificationName("updateUndoState", object: nil)  

    //this error variable has nothing to do with save in your original code 
    if error != nil { 
     print(error?.localizedDescription) 
    } 
} 
catch { 
    //this happens when save() doesn't pass 
    abort() 
} 

ce que vous voulez sans doute écrire est le suivant:

do { 
    try managedObjectContext!.save() 

    //this happens when save did pass 
    NSNotificationCenter.defaultCenter().postNotificationName("updateUndoState", object: nil)  
} 
catch let saveError as NSError { 
    //this happens when save() doesn't pass 
    print(saveError.localizedDescription) 
    abort() 
} 
+0

Je comprends maintenant votre premier extrait de code. Vous avez supposé qu'il avait une autre variable 'error' flottant autour. Sa question révisée montre clairement que ce n'est pas le cas, mais je comprends maintenant pourquoi vous avez écrit ce que vous avez écrit. – Rob

1

Tout à do {} est bon, tout ce qui est catch {} est mauvaise

do { 
    try managedObjectContext!.save() 
    NSNotificationCenter.defaultCenter().postNotificationName("updateUndoState", object: nil) 
} 
catch let error as NSError { 
    print(error.localizedDescription) 
    abort() 
} 

utilisation soit la gestion des erreurs, soit l'instruction abort()