2009-09-26 3 views
34

Cosa succede se sia il blocco che i blocchi finalmente generano un'eccezione?Cosa succede se sia il blocco che i blocchi finalmente generano un'eccezione?

+0

ci sono diverse combinazioni | modelli di nidificazione possibile sia con un fermo e un blocco finally. Potresti voler aggiungere uno snippet di codice per delineare la situazione a cui stai pensando. –

+0

@Justin: (Non sono sicuro che verrai avvisato di questo ...) ho eseguito il rollback della modifica del tag perché (1) hai rimosso Java, il che modifica drasticamente l'intervallo della domanda e (2) hai aggiunto VB. NET, che, pur essendo corretto sotto molti aspetti, non è il modo in cui le cose vengono fatte qui ... (in altre parole, sono un po 'd'accordo con questo, o rimuovo anche C#, visto che .NET è lì). –

+0

@MarkHurd Il problema è che una o più delle risposte si collegano alle soluzioni specifiche .Net - Non posso parlare per la validità delle risposte in Java. Anche altre domande su VB.Net hanno collegamenti a questa domanda (poiché la risposta è la stessa). – Justin

risposta

32

Quando il blocco finally genera un'eccezione, nasconderà effettivamente l'eccezione generata dal blocco catch e sarà quella generata in ultima istanza. È quindi importante registrare le eccezioni quando vengono catturate, o accertarsi che il blocco finally non crei di per sé un'eccezione, altrimenti è possibile ottenere eccezioni lanciate che vengono soffocate e mai viste.

+0

è stato tentato di farlo solo per essere sicuro di controllare ogni messaggio di eccezione dal mio codice di blocco all'interno di try. Io lancio individualmente l'eccezione –

4

Viene lanciata l'ultima eccezione generata.

6

Quando il catch genera un'eccezione, il blocco verrà eseguito e quindi uscirà con un'eccezione. Se il blocco finally genera un'eccezione, il blocco uscirà con un'eccezione.

+0

quindi alla fine quale eccezione verrà lanciata? dal blocco finale o dal blocco catch? – Arthur

+4

L'ultima eccezione generata. : D – NawaMan

4

sua già ricevuto una risposta bene da adrianbanks, ma il seguente post dovrebbe essere interessante: Interesting Exception Results: Throwing Exceptions From the Finally Block

+0

Ho aggiunto un commento sul blog, ma il risultato dell'applicazione Console sembra essere perché il CLR sta segnalando l'eccezione (prima) non gestita durante la fase di filtro (quando viene elaborata la clausola 'When' di VB.NET) , probabilmente in modo che possa essere chiamato un debugger e quindi individuare la riga della prima eccezione. Si nota più semplicemente stampando qualcosa nel 'finally' prima del' throw'. Viene registrata la prima eccezione, quindi viene elaborato il comando 'finally' e viene registrata la seconda eccezione. Questo si verifica per .NET Framework da 1.1 a 3.5. .NET 4.0 riporta solo la prima eccezione. (1.0 & 4.5 non disponibile.) –

-4

HI Nwaman penso si risposta è sbagliata ho provato in finestre appliaction, ho trovato se u scrivere un programma come il sotto di un

try 
{ 
    string s = "hu"; 
    int i = int.Parse(s); 
} 
catch (Exception ex) 
{ 
    string s = "hu"; 
    int i = int.Parse(s); 
    throw new Exception(); 
} 
finally 
{ 
    MessageBox.Show("hi"); 
} 

e questo non si tradurrà infine a excute,

+2

Hmm, l'ho appena provato e finalmente l'ho eseguito. – agentnega