En Java, le throws
mot clé permet à une méthode de déclarer qu'elle ne gérera pas une exception seule, mais la lancera plutôt à la méthode appelante.
Existe-t-il un mot-clé / attribut similaire en C #?
S'il n'y a pas d'équivalent, comment pouvez-vous obtenir le même effet (ou un effet similaire)?
c#
java
exception-handling
throws
Louis Rhys
la source
la source
L'op pose des questions sur l' équivalent C # de la
throws
clause Java - pas sur lethrow
mot - clé. Ceci est utilisé dans les signatures de méthode en Java pour indiquer qu'une exception vérifiée peut être levée.En C #, il n'y a pas d'équivalent direct d'une exception vérifiée Java. C # n'a pas de clause de signature de méthode équivalente.
Se traduit par
la source
Oui, c'est un ancien fil de discussion, mais je trouve fréquemment de vieux fils lorsque je cherche des réponses sur Google, alors j'ai pensé que j'ajouterais quelque chose d'utile que j'ai trouvé.
Si vous utilisez Visual Studio 2012, il existe un outil intégré qui peut être utilisé pour autoriser un équivalent "throws" de niveau IDE.
Si vous utilisez des commentaires de documentation XML , comme mentionné ci-dessus, vous pouvez utiliser la balise <exception> pour spécifier le type d'exception levée par la méthode ou la classe ainsi que des informations sur le moment et la raison de son déclenchement.
exemple:
la source
throws
ne signifie probablement rien pour le runtime, à part être informatif pour le développeur. De même, ce que @mvanella a souligné ici est la façon dont le C # fait exactement la même chose. Je suppose que vous savez déjà que cette "documentation xml" a un but plus important. Je sais que ce fil est vieux.throws
clause ou levé par unethrow
commande. Cela signifie que si une RunTimeException se produit et n'est pas gérée dans la même méthode où elle se produit, l'exécution s'arrêtera là.Voici une réponse à une question similaire que je viens de trouver sur bytes.com :
la source
Après avoir parcouru la plupart des réponses ici, j'aimerais ajouter quelques réflexions.
S'appuyer sur les commentaires de documentation XML et s'attendre à ce que les autres s'appuient sur est un mauvais choix. La plupart des codes C # que j'ai rencontrés ne documentent pas les méthodes complètement et de manière cohérente avec les commentaires de documentation XML. Et puis il y a le plus gros problème que sans les exceptions vérifiées en C #, comment pourriez-vous documenter toutes les exceptions que votre méthode lève pour que votre utilisateur d'API sache comment les gérer toutes individuellement? N'oubliez pas que vous ne connaissez que ceux que vous vous lancez avec le mot-clé throw dans votre implémentation. Les API que vous utilisez dans votre implémentation de méthode peuvent également lancer des exceptions dont vous ne connaissez pas, car elles peuvent ne pas être documentées et que vous ne les gérez pas dans votre implémentation, elles exploseront donc face à l'appelant de votre méthode. En d'autres termes,
Andreas a lié une interview avec Anders Hejlsberg dans les réponses ici sur les raisons pour lesquelles l'équipe de conception C # a décidé de ne pas vérifier les exceptions. La réponse ultime à la question originale est cachée dans cet entretien:
En d'autres termes, personne ne devrait être intéressé par le type d'exception auquel on peut s'attendre pour une API particulière, car vous allez toujours les attraper partout. Et si vous voulez vraiment vous soucier des exceptions particulières, c'est à vous de décider comment les gérer et non à quelqu'un qui définit une signature de méthode avec quelque chose comme le mot-clé Java throws, ce qui oblige un utilisateur d'API à gérer des exceptions particulières.
-
Personnellement, je suis déchiré ici. Je suis d'accord avec Anders que le fait de vérifier les exceptions ne résout pas le problème sans ajouter de nouveaux problèmes différents. Tout comme avec les commentaires de la documentation XML, je vois rarement du code C # avec tout ce qui est enveloppé dans des blocs try finally. Il me semble que c'est en effet votre seule option et quelque chose qui semble être une bonne pratique.
la source
En fait, ne pas avoir vérifié les exceptions en C # peut être considéré comme une bonne ou une mauvaise chose.
Je considère moi-même que c'est une bonne solution car les exceptions vérifiées vous posent les problèmes suivants:
Pour cette raison, dans la plupart des applications plus volumineuses, vous verrez souvent le modèle suivant lorsque coché Des exceptions se produisent:
Ce qui signifie essentiellement émuler la façon dont C # / .NET gère toutes les exceptions.
la source
Vous demandez à ce sujet:
Relancer une exception
ou
la source
throw
. En l'utilisant, la trace de la pile ne sera pas perdue.Il existe quelques similitudes éphémères entre le .Net CodeContract
EnsuresOnThrow<>
et lethrows
descripteur java , en ce sens que les deux peuvent signaler à l'appelant le type d'exception qui pourrait être déclenchée à partir d'une fonction ou d'une méthode, bien qu'il existe également des différences majeures entre les 2:EnsuresOnThrow<>
va au-delà du simple énoncé des exceptions qui peuvent être levées, mais stipule également les conditions dans lesquelles elles sont garanties d'être levées - cela peut être un code assez onéreux dans la méthode appelée si la condition d'exception n'est pas facile à identifier. Javathrows
fournit une indication des exceptions qui pourraient être levées (c'est-à-dire que l'OMI, le focus dans .Net est à l'intérieur de la méthode qui contracte pour prouver lethrow
, alors qu'en Java, le focus se déplace vers l'appelant pour reconnaître la possibilité de l'exception).throws
pour la même exception sur son interface.Manuel des contrats de code ici
la source
Si le but de la méthode c # est de lancer uniquement une exception (comme le dit le type de retour js), je recommanderais simplement de renvoyer cette exception. Voir l'exemple ci-dessous:
la source
Pour ceux qui se demandent, vous n'avez même pas besoin de définir ce que vous attrapez pour le transmettre à la méthode suivante. Dans le cas où vous voudriez que toute votre gestion des erreurs dans un thread principal, vous pouvez simplement tout attraper et le transmettre comme ceci:
la source