2009-07-06 22 views
9

Ho una situazione in cui voglio che venga eseguito un determinato codice, non importa cosa succede, ma ho bisogno di eccezioni per essere passato sullo stack per essere gestito in seguito. È la seguente: Prova/finalmente ignora le eccezioni?


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

andando a ignorare tutte le eccezioni, o le passerà in su? I miei test sembrano dimostrare che sono ancora passati, ma voglio essere sicuro di non essere pazzo.

EDIT: La mia domanda non si tratta di quando e se l'ultima verrà eseguita, si tratta di se le eccezioni continuano a essere lanciate verso l'alto, ma a questo è stata data una risposta ora.

+0

Questo è molto vicino a http://stackoverflow.com/questions/547791/why-use-finally-in-c –

+2

Quale lingua/piattaforma è questa? Java o C#? –

+1

C'è un ottimo wtf giornaliero su questo: http://thedailywtf.com/Articles/My-Tales.aspx –

risposta

7

Ecco una classe di test che mostra che (1) viene finalmente eseguito, indipendentemente dal fatto che vengano lanciate eccezioni; e (2) le eccezioni passano al chiamante.

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

Il codice finally verrà sempre eseguito e le eccezioni verranno passate in su, come dici tu. Questo è più o meno il punto di try/finally - per avere un codice che verrà sempre eseguito, anche quando vengono lanciate eccezioni.

Edit: Questo è vero per qualsiasi linguaggio che fornisce il try/finally costrutto, ma ci sono avvertimenti per alcune lingue, come sottolinea Adam nel suo commento e Sam fa notare nella sua risposta.

+0

questo non è proprio vero, vedere le risposte correlate –

+0

Credo che Richie sia corretta; in un tentativo/finally, il codice all'interno del blocco try viene eseguito e indipendentemente dal fatto che venga lanciata un'eccezione, il codice all'interno del blocco finally viene eseguito in seguito. – snake

+0

@snake, vedi la mia risposta e le relative risposte, ci sono alcuni casi limite in cui finalmente in C# non verrà eseguito. –

2

Se questa è la C#:

Le risposte qui sono a destra, finally viene eseguito e le eccezioni sono "passati up". Ma per illustrare come sia facile capirlo:

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

Quando si esegue questa semplice applicazione poco, console, viene generata l'eccezione e quindi viene eseguito il blocco finally.