2013-01-10 26 views
6

La mia ipotesi è che il blocco finally venga sempre eseguito finché il programma è in esecuzione. Tuttavia, in questa app per console, il blocco finally non sembra essere eseguito.Perché non viene finalmente eseguito?

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

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

uscita

Result

Nota: quando l'eccezione è stato gettato, Windows Me askmed se volevo terminare l'appliation, ho detto 'Sì.'

+4

Clicca 'no' e vediamo cosa succede –

+0

eseguirlo dalla riga di comando anziché all'interno del vostro IDE – KevinDTimm

+0

E 'un aspetto molto strano. 'finally' dovrebbe essere scritto esattamente dopo StackTrace. –

risposta

2

Quando si ottiene "ConsoleApplication1" ha smesso di rispondere, si hanno due scelte.

Windows Error Reporting dialog

Se si preme annullare, l'eccezione non gestita è consentito di continuare fino alla fine viene terminata l'applicazione. Ciò consente il blocco finally da eseguire. Se non si preme Annulla, quindi Windows Error Reporting interrompe il processo, raccoglie un minidump e quindi termina l'applicazione. Ciò significa che il blocco finally non viene eseguito.

In alternativa, se gestisci l'eccezione in un metodo più elevato, vedrai sicuramente il blocco finally. Per esempio:

static void unhandled() 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    finally 
    { 
     Console.WriteLine("finally"); 
    } 
} 

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper; 
    try 
    { 
     unhandled(); 
    } 
    catch (Exception) 
    { 
     // squash it 
    } 
} 

dà sempre l'uscita "finalmente"

6

Eseguito in realtà. Proprio tu non l'hai notato. Proprio quando vedi Windows is checking for a solution to the problem fai clic su Annulla e guardalo.

enter image description here

+1

In che ambiente stai correndo? Sto usando Windows 7, 64. Quando ti chiede "Windows sta cercando una soluzione al problema .." non fare clic su Annulla. Lascia che faccia la sua cosa. – Anish

+0

Sto usando Windows 7-32 bit. Si hai ragione. –

3

E 'possibile che si esegue il debug e quando si fa clic su No, l'esecuzione è di essere fermato dal debugger.

+0

Questa è la vera ragione. –

2

Durante l'esecuzione dalla riga di comando. Proprio quando Windows tenta di terminare l'applicazione con garbo clicca su no o cancel se l'applicazione non risponde. enter image description here

+0

In che ambiente stai correndo? Sto usando Windows 7, 64. Quando ti chiede "Windows sta cercando una soluzione al problema .." non fare clic su Annulla. Lascia che faccia la sua cosa. – Anish

+0

Quindi Windows interromperà l'applicazione senza lasciare che stampi sulla console –

-2

Un'eccezione fa esplodere la pila finché non trova un gestore. In caso contrario, il programma termina. Questo è il caso nel tuo scenario ... non c'è un gestore, quindi il programma esce prima che arrivi al blocco finale.

+2

-1 - 'finally' deve essere eseguito * prima * che bolle in cima allo stack - in effetti, * durante * lo srotolamento dello stack. –

+0

l'intero fine di apparentemente perde il suo uso se non c'è una presa? questo è nuovo su di me: L – RhysW

+0

Scusa, è stata una risposta spensierata. – ktm5124

Problemi correlati