Je sais que nous pouvons trouver une réponse appropriée sur Google, mais je préfère écouter vos opinions personnelles (et peut-être techniques).
Quelle est la principale raison de la différence entre Java et C # en lançant des exceptions?
En Java, la signature d'une méthode qui lève une exception doit utiliser le mot clé "throws", alors qu'en C #, vous ne savez pas au moment de la compilation si une exception peut être levée.
Réponses
Trop de publicités?Dans l'article Le problème, avec les Exceptions et Anders Hejlsberg (le concepteur du langage C#) propre voix, il y a trois raisons principales pour C# ne supportant pas vérifié les exceptions sont trouvé et vérifié en Java:
-
Neutre sur Checked Exceptions
"C# est essentiellement le silence sur les bagages exceptions question. Une fois mieux la solution est connue-et croyez-moi, nous continuer à penser à elle-nous pouvons aller de retour et fait mettre quelque chose dans place."
-
Le contrôle de version avec Checked Exceptions
"L'ajout d'une nouvelle exception à jette la clause dans une nouvelle version pauses client code. C'est comme l'ajout d'une méthode à une de l'interface. Après la publication d'un l'interface, c'est pour toutes les pratiques fins immuable, ..."
"C'est drôle comment les gens pensent que la chose importante à propos des exceptions est de les manipuler. Ce n'est pas le chose importante à propos des exceptions. Dans un bien-demande écrite il y a un rapport de dix à une, à mon avis, de essayez enfin pour essayer de l'attraper. Ou en C#,
using
des déclarations, qui sont comme essayer enfin." -
L'évolutivité de Checked Exceptions
"Dans le petit, checked exceptions sont très séduisant...Le problème commence quand vous commencez à construire de grands les systèmes où vous parlez à quatre ou cinq différents sous-systèmes. Chaque sous-système de lance de quatre à dix des exceptions. Maintenant, chaque fois que vous marchez jusqu' l'échelle de l'agrégation, vous avez cette exponentielle de la hiérarchie ci-dessous vous des exceptions que vous avez à traiter. Vous finissez par avoir à déclarer 40 les exceptions que vous pourriez jeter.... Il vient de ballons hors de contrôle."
Dans son article, "Pourquoi ne pas en C# d'exception spécifications?", Anson Horton (Visual C# Gestionnaire de Programme) répertorie également les raisons suivantes (voir l'article pour plus de détails sur chaque point):
- Gestion des versions
- De la productivité et de la qualité du code
- Impossibilité d'avoir la classe auteur différencier coché et décoché exceptions
- La difficulté de déterminer la bonne exceptions pour les interfaces.
Il est intéressant de noter que le C# n'est, néanmoins, documentation à l'appui des exceptions levées par une méthode donnée par l' <exception>
balise et le compilateur prend même la peine de vérifier que les renvois type d'exception existe bel et bien. Il y a, cependant, aucun contrôle n'est effectué à l'appel de sites ou de l'utilisation de la méthode.
Vous pouvez également songer à l' Exception de Chasseur, qui est une professionnelle de l'outil par la Porte Rouge Logiciel, qui utilise l'analyse statique pour déterminer et signaler les exceptions levées par une méthode et qui peut potentiellement aller uncaught:
Exception Hunter est une nouvelle analyse outil de recherche et indique l'ensemble des des exceptions possibles à vos fonctions pourrait lancer, avant même de navire. Avec elle, vous pouvez trouver non gérée exceptions facilement et rapidement, jusqu'à la ligne de code qui est en train de jeter le des exceptions. Une fois que vous avez les résultats, vous pouvez décider des exceptions besoin pour être traitées (à quelques exceptions près le code de traitement) avant de relâcher votre d'applications dans la nature.
Enfin, Bruce Eckel, auteur de Penser en Java, a un article intitulé, "Java besoin Checked Exceptions?", que peut-être la peine de lire jusqu'ainsi parce que la question de savoir pourquoi vérifié les exceptions ne sont pas là en C# habituellement prend racine dans les comparaisons de Java.
Parce que la réponse aux exceptions vérifiées est presque toujours:
try {
// exception throwing code
} catch(Exception e) {
// either
log.error("Error fooing bar",e);
// OR
throw new RuntimeException(e);
}
Si vous savez réellement qu'il y a quelque chose que vous pouvez faire si une exception particulière est levée, alors vous pouvez l'attraper puis la gérer, mais sinon, ce ne sont que des incantations pour apaiser le compilateur.
La philosophie de base de C # en matière de conception est qu’il est rarement utile de capturer des exceptions, alors que nettoyer des ressources dans des situations exceptionnelles est très important. Je pense qu'il est juste de dire que using
(le modèle identifiable) est leur réponse aux exceptions vérifiées. Voir [1] pour plus.
Au moment de la conception de .NET, Java vérifiait les exceptions depuis un certain temps et cette fonctionnalité était considérée au mieux par les développeurs Java comme controversée . Les concepteurs .NET ont donc choisi de ne pas l'inclure en langage C #.
Fondamentalement, qu'une exception doit être manipulé ou pas, c'est une propriété de l' appelant, plutôt que de la fonction.
Par exemple, dans certains programmes, il n'existe pas de valeur dans le traitement d'un IOException (pensez ad hoc utilitaires de ligne de commande pour exécuter des données à croquer; ils n'allons jamais être utilisé par un "utilisateur", ils sont spécialiste des outils utilisés par des spécialistes de personnes). Dans certains programmes, il y a une valeur dans le traitement d'un IOException à un point de "proximité" à l'appel (peut-être que si vous obtenez un FNFE pour votre fichier de configuration, vous pourrez revenir à des valeurs par défaut, ou dans un autre emplacement, ou quelque chose de cette nature). Dans d'autres programmes, vous voulez qu'il bulle un long chemin avant d'être traitées (par exemple, vous pouvez être amené à interrompre jusqu'à ce qu'il atteigne l'INTERFACE utilisateur, à quel point il doit alerter l'utilisateur que quelque chose a mal tourné.
Chacun de ces cas dépend de la _application, et pas de la bibliothèque. Et pourtant, avec les exceptions, c'est la bibliothèque qui prend la décision. La Java IO bibliothèque qui prend la décision qu'il va utiliser checked exceptions (qui encourage fortement la manipulation que du local à l'appel) lorsque, dans certains programmes, une meilleure stratégie peut être non-locales de manutention, ou pas de manipulation à tous.
Cela montre le vrai défaut avec les exceptions dans la pratique, et il est beaucoup plus fondamental que le superficiel (bien également important défaut que de trop nombreuses personnes vont écrire stupide, les gestionnaires d'exception juste pour faire le compilateur se taire. Le problème que je décris est un problème, même quand l'expérience, consciencieux développeurs sont l'écriture du programme.