Quelle est la meilleure façon de lancer une exception objective-c/cocoa?
Réponses
Trop de publicités?Un mot de prudence ici. En Objective-C, à la différence de nombreux autres langues, en général, vous devriez essayer d'éviter d'utiliser les exceptions pour les erreurs courantes des situations qui peuvent se produire en fonctionnement normal.
La documentation d'Apple pour l'Obj-C 2.0 est la suivante: "Important: les Exceptions sont les ressources à forte intensité en Objective-C. Vous ne devez pas utiliser les exceptions pour les général de contrôle de flux, ou tout simplement pour signifier des erreurs (comme un fichier n'étant pas accessibles)"
Apple conceptuel de gestion des exceptions la documentation explique le même, mais avec plus de mots: "Important: nous Vous conseillons de réserver l'utilisation d'exceptions pour la programmation ou à des erreurs d'exécution inattendues, telles que des limites d'un accès à une collection, les tentatives de muter des objets immuables, l'envoi d'un message non valide, et de perdre la connexion au serveur de fenêtre. Vous avez l'habitude de prendre soin de ces sortes d'erreurs avec les exceptions lorsqu'une application est en cours de création plutôt qu'à l'exécution. [.....] Au lieu d'exceptions près, les objets d'erreur (NSError) et le Cacao en erreur-mécanisme de livraison sont de la méthode recommandée pour connaître les erreurs dans les applications Cocoa."
Les raisons pour cela est du en partie à adhérer aux idiomes de programmation en Objective-C (en utilisant les valeurs de retour dans les cas les plus simples et les paramètres de référence (souvent le NSError classe) dans les cas plus complexes), d'une part de lancer et attraper les exceptions est beaucoup plus cher et enfin (et perpaps le plus important) que l'Objective-C, les exceptions sont d'une mince enveloppe C setjmp() et longjmp() fonctionne, pour l'essentiel gâcher votre attention à la gestion de la mémoire, voir cette explication.
Je n'ai pas de rep pour commenter eJames réponse, donc je suppose que j'ai besoin de mettre la mienne ici. Pour ceux qui viennent de Java arrière-plan, vous vous souviendrez que Java fait la distinction entre Exception et RuntimeException. Exception est un checked exception, et RuntimeException n'est pas cochée. En particulier, Java suggère d'utiliser checked exceptions pour les "normales conditions d'erreur" et non des exceptions pour des "erreurs d'exécution causé par une erreur du développeur." Il semble que l'Objective-C les exceptions doivent être utilisés dans les mêmes lieux, les mêmes vous le feriez avec un décoché exception, et le code d'erreur valeurs de retour ou NSError valeurs sont privilégiées dans des endroits où vous utiliseriez un checked exception.
Je pense que pour être cohérent, il est plus agréable à utiliser @lancer avec votre propre classe qui étend la classe NSException. Ensuite, vous utilisez les mêmes notations pour les try catch enfin:
@try {
.....
}
@catch{
...
}
@finally{
...
}
Apple explique ici comment lancer et de gérer les exceptions: D'Intercepter Les Exceptions De Lever Des Exceptions