11
votes

Essayez-t-il / enfin ignorer les exceptions?

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 commentaires

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


Cela pourrait aussi être javascript ...


4 Réponses :


18
votes

Le code enfin est toujours exécuté et les exceptions seront transmises, comme vous le dites. C'est à peu près le point de essayer / enfin - avoir un code qui fonctionnera toujours, même lorsque des exceptions sont lancées.

EDIT : Ceci est vrai pour n'importe quelle langue qui fournit le Essayez / enfin 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.


5 commentaires

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 , 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.



9
votes

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;
        }
    }
}


0 commentaires

3
votes

En supposant que ceci est C #, finalement exécutera toujours si vous obtenez un StackoverflowException ou un ExécutingengineException

En outre, des exceptions asynchrones telles que Threadabortexception peuvent interrompre le flux d'un bloc enfin, ce qui l'exécute partiellement.

Voir les questions connexes:

En C #, le blocage enfin sera exécuté en essayez, enfin, enfin si une exception non gérée est lancée?


0 commentaires

2
votes

si c'est c # :

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: xxx

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é.


0 commentaires