L'utilisation d'un try-finally "en bloc sans un "catch" bloc
Sont là des situations où il est approprié d'utiliser une try-finally
bloc sans catch
bloc?
- Sur MSDN, voir try-finally (Référence C#). Notez que l'article se réfère à l'utilisation combinée de
try
etfinally
comme le "try-finally déclaration."
Vous devez vous connecter pour publier un commentaire.
Vous pouvez l'utiliser pour faire en sorte que certaines actions se produisent après la
try
contenu ou sur une exception, mais quand vous ne souhaitez pas consommer qu'une exception.Juste pour être clair, cela ne cache pas les exceptions. Le
finally
bloc est exécuté avant que l'exception est propagée haut de la pile des appels.Vous pouvez aussi les utiliser par inadvertance lorsque vous utilisez le
using
mot-clé, parce que cette compile dans untry-finally
(pas de convertir, mais pour la commodité du raisonnement, il est assez proche).Code qui s'exécute dans
finally
n'est pas garanti, cependant le cas où il n'est pas garanti, c'est assez de bord, je ne peux même pas vous en rappeler. Ce dont je me souviens est, si vous êtes dans ce cas, les chances sont très bonnes que de ne pas courir lefinally
n'est pas votre plus gros problème 🙂 donc, fondamentalement, ne vous en faites pas.Mise à jour de Tobias:
finally
ne sera pas exécuté si le processus est tué.Mise à jour à partir du riz Paddy: Conditions quand, finalement, ne s'exécute pas dans un .net try..finally bloc
La plus répandue est l'exemple que vous pouvez voir est de disposer d'une connexion de base de données ou de ressources externes, même si le code ne fonctionne pas:
Compile en quelque chose comme:
using
est équivalenttry-finally
. Vous devez uniquement utiliser destry-finally
lorsque vous voulez faire un peu de nettoyage à l'intérieur definally
et ne se soucient pas de l'exception.La meilleure approche sera
Faire nettoyer appelé par
using
échoue, votre code ne sera pas échouer.Il y a certaines conditions, lors de
finally
ne sera exécutée.StackOverflowException
ouExecutingEngineException
.Espère que cela répond à votre doute.
Si vous avez, par exemple, une ressource non managée de créer et d'utiliser dans le bloc try, vous pouvez utiliser le bloc finally pour vous assurer de la libération de la ressource. Le bloc finally est toujours exécuté en dépit de ce qui se passe (par exemple, les exceptions) dans le bloc try.
E. g. le verrou(x) déclaration est vraiment:
Le bloc finally est toujours appelée à s'assurer que le verrou exclusif est libéré.
Bonne Explication à l'aide de code:
Si MyMethod2 ou MyMethod3 déclenche une exception, il sera pris par MyMethod1. Toutefois, le code de la MyMethod2 doit exécuter nettoyage de code, par exemple la fermeture d'une connexion de base de données, avant que l'exception est passé à MyMethod1.
http://forums.asp.net/t/1092267.aspx?Try+without+Catch+but+with+finally+doesn+t+throw+error+Why+no+syntax+error+
Vous avez besoin d'un bloc finally, lorsque n'importe qui (le cas échéant) les exceptions sont capturés ou même si aucun n'est pris, vous voulez toujours exécuter du code avant de le bloquer les sorties. Par exemple, vous pouvez fermer et ouvrir un fichier.
Voir Aussi try-finally
try/finally: lorsque vous ne souhaitez pas gérer toutes les exceptions, mais veulent s'assurer une certaine action(s) se produire si une exception est levée par le code.
Voici une situation où vous pourriez vouloir essayer enfin: lorsque vous utilisez normalement à l'aide d'instruction, mais ne peut pas parce que vous êtes à l'appel d'une méthode par réflexion.
Cela ne fonctionne pas
au lieu d'utiliser
Ont un oeil sur le lien suivant:
https://softwareengineering.stackexchange.com/questions/131397/why-use-try-finally-without-a-catch-clause
Il dépend de l'architecture de votre application et de l'opération que vous effectuez dans le bloc.
Je ne sais rien à propos de C#, mais il semble que tout ce que vous pourriez faire avec un try-finally, vous pourriez plus élégamment faire avec un instruction d'utilisation. C++ n'ont même pas enfin que à la suite de son RAII.
Voici un cas d'utilisation que j'ai toujours (euh..) utilisation:
1.nous pouvons utiliser le bloc try sans attraper, mais nous devrions utiliser le catch/finally,
l'un d'eux.
2.Nous ne pouvons pas utiliser uniquement le bloc de l'essai.