Le choix est délibéré décision de conception.
Ils ne veulent pas de la situation où vous n'avez pas besoin de déclarer exception jeter comme en Objective-C, C++ et C#, parce que les appelants doivent assumer toutes les fonctions de lancer des exceptions et comprennent standard pour gérer les exceptions qui pourraient ne pas se produire, ou de simplement ignorer la possibilité d'exceptions. Aucune de ces sont idéal et le deuxième fait exception inutilisable sauf pour le cas où vous voulez à la fin du programme, parce que vous ne pouvez pas garantir que chaque fonction dans la pile d'appel a correctement libéré des ressources lorsque la pile est déroulée.
L'autre extrême est l'idée que vous avez défendu et que chaque type d'exception peuvent être déclarés. Malheureusement, les gens semblent s'opposer à la suite de ce qui est que vous avez un grand nombre de blocs catch, de sorte que vous pouvez gérer chaque type d'exception. Ainsi, par exemple, en Java, ils vont jeter Exception
la réduction de la situation de la même façon que nous avons de Swift ou, pire, ils l'utilisation incontrôlée des exceptions de sorte que vous pouvez ignorer complètement le problème. Le GSON bibliothèque est un exemple de cette dernière approche.
Nous avons choisi d'utiliser décoché exceptions pour indiquer un échec d'analyse. Ceci est principalement fait parce que d'habitude, le client ne pourra pas récupérer de la mauvaise entrée, et donc les forcer à attraper un checked exception bâclée code de la capture() de bloc.
https://github.com/google/gson/blob/master/GsonDesignDocument.md
C'est une monumentale de mauvaise décision. "Salut, vous ne pouvez pas leur faire confiance pour faire votre propre gestion des erreurs, de sorte que votre application devrait planter à la place".
Personnellement, je pense que Swift obtient l'équilibre sur la droite. Vous avez à gérer des erreurs, mais vous n'avez pas à écrire des rames de catch états de le faire. Si ils sont allés plus loin, les gens trouveront des moyens pour contourner le mécanisme.
La pleine justification de la décision de conception est à https://github.com/apple/swift/blob/master/docs/ErrorHandlingRationale.rst
MODIFIER
Il semble y avoir certaines personnes à avoir des problèmes avec certaines des choses que j'ai dit. Voici donc une explication.
Il existe deux grandes catégories de raisons pour lesquelles un programme peut lever une exception.
- inattendu conditions de l'environnement externe au programme comme un IO erreur sur un fichier ou des données incorrectes. Ce sont des erreurs que l'application peut généralement gérer, par exemple en signalant l'erreur à l'utilisateur et en leur permettant de choisir une autre voie d'action.
- Des erreurs de programmation tels que le pointeur null ou un tableau lié erreurs. La bonne façon de résoudre ces est pour le programmeur pour faire un changement de code.
Le deuxième type d'erreur ne devrait pas, en général, être pris, parce qu'ils indiquent une fausse supposition sur l'environnement que pourrait signifier le programme de données est corrompue. Il ma pas moyen de continuer en toute sécurité, de sorte que vous avez à faire avorter.
Le premier type d'erreur peut généralement être récupérés, mais dans le but de récupérer en toute sécurité, chaque frame de pile doit être déroulé correctement, ce qui signifie que la fonction correspondant à chaque frame de pile doit être conscient que les fonctions qu'il appelle peut lever une exception et prendre des mesures pour s'assurer que tout est nettoyé régulièrement si une exception est lancée, avec, par exemple, un bloc finally ou l'équivalent. Si le compilateur ne fournissons pas de support pour raconter le programmeur ils ont oublié de plan pour les exceptions, le programmeur n'a pas toujours le plan pour les exceptions et écrire de code que les fuites de ressources ou de feuilles de données dans un état incohérent.
La raison pour laquelle le gson attitude est tellement consternant, c'est parce qu'ils sont en train de dire que vous ne pouvez pas récupérer d'une erreur d'analyse (en fait, le pire, ils vous disent que vous n'avez pas les compétences pour récupérer d'une erreur d'analyse). C'est une chose ridicule d'affirmer, les gens tentent d'analyser invalid JSON fichiers de tous les temps. Est-ce une bonne chose que mon programme se bloque si quelqu'un sélectionne un fichier XML par erreur? Aucun ne l'est pas. Il doit signaler le problème et leur demander de sélectionner un autre fichier.
Et le gson chose a été, par la manière, juste un exemple de pourquoi l'utilisation incontrôlée des exceptions pour les erreurs que vous pouvez récupérer à partir de qui est mauvais. Si je veux récupérer de quelqu'un de la sélection d'un fichier XML, j'ai besoin d'attraper d'exécution de Java exceptions, mais lesquelles? Et bien je pouvait regarder dans le Gson docs pour savoir, en supposant qu'elles sont correctes et à jour. Si ils avaient disparu avec les exceptions, l'API serait dites-moi quelles sont les exceptions à attendre, et le compilateur me dire si je n'ai pas les gérer.