2009-07-06 10 views
9

Je suis dans une situation où je veux que certains codes soient exécutés quoi qu'il arrive, mais j'ai besoin d'exceptions pour être également transmises à la pile pour être traitées plus tard. Est-ce que: Est-ce que essayer/finalement ignorer les exceptions?


try 
{ 
    // code 
} 
finally 
{ 
    // code that must run 
} 

va ignorer les exceptions, ou va-t-il les transmettre? Mes tests semblent montrer qu'ils sont encore perdus, mais je veux être sûr que je ne suis pas fou.

EDIT: Ma question ne concerne pas le moment et le moment où le dernier sera exécuté, il s'agit de savoir si les exceptions sont toujours levées vers le haut, mais cela a été répondu maintenant.

+0

Ceci est assez proche de http://stackoverflow.com/questions/547791/why-use-finally-in-c –

+2

Quelle langue/plate-forme est-ce? Java ou C#? –

+1

Il ya un très bon wtf quotidien à ce sujet: http://thedailywtf.com/Articles/My-Tales.aspx –

Répondre

7

Voici une classe de test qui montre que (1) s'exécute finalement, indépendamment du fait 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; 
     } 
    } 
} 
16

Le code finally sera toujours exécuté, et les exceptions seront transmises, comme vous le dites. C'est à peu près le point de try/finally - d'avoir du code qui sera toujours exécuté, même si des exceptions sont levées.

Modifier: Ceci est vrai pour toutes les langues qui fournit la construction try/finally, mais il y a des mises en garde pour certaines langues, comme Adam souligne dans son commentaire et Sam fait remarquer dans sa réponse.

+0

ce n'est pas vraiment vrai, voir les réponses liées –

+0

Je crois que Richie est correct; dans un essai/enfin, le code à l'intérieur du bloc try est exécuté, et peu importe si une exception est levée, le code dans le bloc finally est exécuté par la suite. – snake

+0

@snake, voir ma réponse et les réponses connexes, il y a des cas de bords où finalement en C# ne va pas être exécuté. –

2

Si cela est C#:

Les réponses sont ici à droite, l'est enfin courir et les exceptions sont "laissé passer". Mais pour illustrer combien il est facile de le comprendre:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      throw new Exception("testing"); 
     } 
     finally 
     { 
      Console.WriteLine("Finally"); 
     } 
    } 
} 

Lors de l'exécution de cette application simple, petite console, l'exception est levée, puis le bloc finally est exécuté.