J'ai une situation où je veux que certains Code soient exécutés, peu importe ce qui se passe, mais j'ai besoin d'exceptions pour être transmis par la pile pour être traitée plus tard. Est ce qui suit:
try { // code } finally { // code that must run }
4 Réponses :
Le code enfin code> est toujours exécuté et les exceptions seront transmises, comme vous le dites. C'est à peu près le point de
essayer / enfin code> - avoir un code qui fonctionnera toujours, même lorsque des exceptions sont lancées. P>
Essayez / enfin code> construction, mais il y a des mises en garde pour certaines langues, car Adam souligne dans son commentaire et Sam souligne dans sa réponse. P>
Ce n'est pas vraiment vrai, voir réponses connexes
Je crois que Richie est correct; En essayant / enfin, le code à l'intérieur du bloc d'essai est exécuté et quelle que soit la question de savoir si une exception est lancée, le code dans le bloc enfin est exécuté par la suite.
@Snake, voir ma réponse et les réponses associées, il existe des cas de bord où enfin en C # ne va pas être exécuté.
Aussi, que répondez-vous, C # Java ou JavaScript?
Il y a quelques cas de bord dans lesquels le bloc enfin ne fonctionne pas (StackoverFlowException dans Certaines langues i>, processus se terminer, le cordon d'alimentation est tiré, etc.), mais dans la plupart des cas, le blocage final sera exécuté puis propager l'exception vers le bas.
Voici une classe de test qui montre que (1) est finalement exécutée, que des exceptions soient levées; et (2) les exceptions sont transmises à l'appelant.
public class FinallyTest extends TestCase { private boolean finallyWasRun = false; public void testFinallyRunsInNormalCase() throws Exception { assertFalse(finallyWasRun); f(false); assertTrue(finallyWasRun); } public void testFinallyRunsAndForwardsException() throws Exception { assertFalse(finallyWasRun); try { f(true); fail("expected an exception"); } catch (Exception e) { assertTrue(finallyWasRun); } } private void f(boolean withException) throws Exception { try { if (withException) throw new Exception(""); } finally { finallyWasRun = true; } } }
En supposant que ceci est C #, finalement exécutera toujours si vous obtenez un StackoverflowException ou un ExécutingengineException P>
En outre, des exceptions asynchrones telles que Threadabortexception peuvent interrompre le flux d'un bloc enfin, ce qui l'exécute partiellement. p>
Voir les questions connexes: p>
Les réponses ici ont raison, le terme est exécuté et les exceptions sont "transmises". Mais pour illustrer à quel point il est facile de le comprendre: p> Lors de l'exécution de cette application simple et simple de console, l'exception est levée et le bloc enfin est exécuté. p> p>
Ceci est assez proche de Stackoverflow.com/questions/547791/whay-Utilisation-finally-in-c
Quelle langue / plate-forme est-ce? Java ou C #?
Il y a une jolie bonne quotidienne à ce sujet: thedailywtf.com/articles/my-tales.aspx a>
Cela pourrait aussi être javascript ...