Quelle est la différence entre 2 conditions? Chaque fois que la méthode1 ou la méthode2 est exécutée, un bloc de code doit être exécuté. Il me semble que 2 méthodes sont identiques.
// example method1 void Method1(void) { try { // do something } catch (Exception ex) { // do something } finally { // do something whenever method1 runs } } // example method2 void Method2(void) { try { // do something } catch (Exception ex) { // do something } // do something whenever method2 runs }
7 Réponses :
Le code dans le bloc enfin fonctionne de toute façon après la prise try, elle est très utile pour le nettoyage.
try { // open resources } catch (Exception ex) { // something bad happened } finally { // close resources that are still opened }
Dans votre premier exemple, vous pouvez ré-jeter l'exception et le code à l'intérieur de l'exécution finalement. Cela ne serait pas possible dans le deuxième exemple.
Si vous choisissez de ne pas ré-jeter l'exception, alors oui il y a peu de différence. Cependant, ceci est considéré comme
retour code>), le mot clé enfin code> vous permet d'exprimer que lorsqu'une exception se produit (ou que vous Retour code> à partir d'un Essayez code>) Vous voulez toujours que l'exécution fasse quelque chose au fur et à mesure de son départ. P> Pour répondre à la question face à face, c'est un must quand vous en avez besoin et Pas quand tu ne le fais pas.
P>
lecture supplémentaire forte> Pour être du côté sûr, avant de tenter de commencer à utiliser ce mot clé, veuillez lire la documentation pour cela: P>
http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx p>
et la manipulation des exceptions Mots-clés en général: p>
http: //msdn.microsoft.com/en-us/library/s7fekhdy.aspx
p>
exemples strong> attrape une exception pour faire quelque chose avec elle, puis le jeter. Utilisez enfin code> pour appeler tout code de rangement: p> xxx pré> n'inscrivez aucun intérêt pour accrocher des exceptions, mais utilisez enfin Code> pour ranger le code: p> xxx pré> retour de votre Essayez code> car il a l'air bien formaté, mais utilisez toujours enfin code > Pour garder le code de rangement: p> xxx pré> p>
Eh bien, oui et non. J'ai une tonne de captures (scénarios de réthrow dans les classes de base - qui appellent une interface de journalisation pour écrire l'exception au journal de l'application. Même si elles sont traitées plus loin, je veux connaître des trucs comme des exceptions de base de données tout le temps.
@Tomtom ils ne sont pas consommés, ils sont observés puis propagés. Par consommé, je veux dire avalé de ne plus jamais être vue.
@Adamhouldsworthorth Il est clairement conscient de ce qui ne comprend enfin que cela ne comprend pas pourquoi il en aurait besoin. Je pense que cela l'aiderait. Bien plus que "lire la spécification".
@AdamHouldsworthorth Désolé d'avoir suggéré comment vous pourriez améliorer votre réponse. J'essaie d'aider les gens. Je vois que vous avez supprimé le commentaire en question. Désolé je ne voulais pas toucher un nerf.
Laissez-nous Continuer cette discussion en chat
Cela se comportera très différemment selon que vous Donc: ce n'est pas à bien des égards, retour code> à partir du
essayez code>, par exemple. Aussi - le
enfin code> fonctionnera même si le
Catch CODE> jette une exception (ou relève l'exception originale), qui ne se produira pas sans le
enfin code >. P>
enfin code>. P>
Essayez code> /
enfin code> est beaucoup plus courant que
Essayez code> /
attrape code> ou
ou
Essayez code> /
attrape code> /
enfin code>. p>
Le bloc enfin garantit que tout code à l'intérieur toujours strong> est exécuté, donc si vous avez une déclaration de retour à l'intérieur de votre bloc d'essai ou réthrow une exception dans votre bloc de capture, le code à l'intérieur du bloc enfin sera toujours Exécuter. P>
Il est indispensable si vous devez vous assurer que quelque chose se passe indépendamment (par exemple, disposer d'une ressource, etc.) P>
La grande différence est que tenter ... Catch dirigera l'exception, caché le fait qu'une erreur s'est produite. Essayez [Finalement exécutera votre code de nettoyage, puis l'exception va continuer, pour être gérée par quelque chose qui sait quoi faire avec elle. P>
Vous n'avez absolument pas besoin d'avoir le bloc Considérons Les éléments suivants: p> le code après le Aussi une instruction code> de retour code> provoquera que le code ne soit pas exécuté, tandis que le final sera toujours exécuté (aussi, ici, vous pouvez voir que La capture peut être ignorée aussi, permettant à toutes les exceptions de propoger vers le haut - après avoir exécuté le Chaque fois que vous avez le code de nettoyage qui doit être un code de nettoyage qui doit être exécuter à la fin d'une méthode, utilisez enfin code>, cependant, il vous garantit que le code de son utilisation sera toujours exécuté (sauf si il y a une exception dans le enfin!).
try / attrape code> n'exécutera pas si une exception est lancée. De plus, si le code dans le bloc code> code> est une erreur qui provoque une exception (telle que votre journalisation, lancez une exception inattendue), le code qui devrait avoir été dans le
enfin code> sera ne pas exécuter, laisser et nettoyer et nettoyer. p>
enfin code>): p>
enfin code> (ou si vos objets impliquent
Idisposable code> utilisent le
à l'aide de code> instruction). P> p>
Comme vous savez que le code écrit à l'intérieur du bloc enfin fonctionne toujours. Veuillez consulter le point suivant écrit ci-dessous, il effacera votre toute confusion. p>
Vous devez être concret sur le
faire quelque chose code> s pour en faire une question.
dépend de ce que "faire quelque chose" fait
Veuillez lire ce qui suit pour plus d'informations. Enfin est facultatif où vous pourriez libérer des ressources après la fin du traitement. msdn.microsoft.com/en-us/Library /fk6t46tz(v=vs.71).aspx
Votre exception dans la méthode2 signifierait que vous ne serez peut-être jamais à la fin de la méthode. Dans la méthode 1 enfin sera toujours exécuté. Pas posté comme une réponse parce que je laisserai quelqu'un d'autre à donner des exemples, etc.
Non, ils ne sont pas les mêmes. Un bloc
enfin code> garantit que le code qu'il contient fonctionne, peu importe ce qui se produit.
Ne pas attraper ce que vous ne pouvez pas gérer
Question vb.net, mais à peu près la même chose: Stackoverflow.com/Questions/11586667/...