Condizioni in cui finalmente non viene eseguito in un .net try..finally block
-
02-07-2019 - |
Domanda
Fondamentalmente ho sentito che alcune condizioni faranno saltare .net oltre il blocco infine. Qualcuno sa quali sono queste condizioni?
Soluzione
Due possibilità:
Il blocco finally non verrà eseguito quando c'è StackOverflowException
poiché non c'è spazio nello stack per eseguire anche altro codice. Inoltre, non verrà chiamato quando c'è un ExecutionEngineException
, che può derivare da una chiamata a Environment.FailFast ()
.
Altri suggerimenti
A meno che il CLR non esploda e vada in crash con ExecutingEngineException (ne ho visti alcuni nei giorni .net 1.1 con la giusta quantità di interoperabilità COM :) .. Penso che finalmente dovrebbe sempre esegui.
È possibile ottenere una situazione in cui il codice nel blocco try provoca il lancio di SecurityException prima dell'inserimento del blocco try (invece viene generata l'eccezione quando viene chiamato il metodo di contenimento (vedere http://msdn.microsoft.com/en-us/library/fk6t46tz (VS.71) .aspx )), in questa situazione non inserisci nemmeno il blocco try, quindi il codice nel blocco finally non viene mai chiamato.
Altre possibilità includono StackOverflowException ed ExecutingEngineException.
Infine
su thread in background
potrebbe non essere eseguito. Tuttavia, dipende dalla completa esecuzione del thread in primo piano principale
che termina l'operazione thread in background
anche prima dell'esecuzione completa del thread in background
.
class Program
{
static void Main(string[] args)
{
Program prgm = new Program();
Thread backgroundThread = new Thread(prgm.CheckBgThread);
backgroundThread.IsBackground = true;
backgroundThread.Start();
Console.WriteLine("Closing the program....");
}
void CheckBgThread()
{
try
{
Console.WriteLine("Doing some work...");
Thread.Sleep(500);
}
finally
{
Console.WriteLine("This should be always executed");
}
}
}
Esiste anche il metodo Application.Exit.
Né il codice che segue un blocco finally, né il codice negli ambiti esterni, verrà eseguito senza che il blocco finally sia stato avviato per primo (un'eccezione all'interno del blocco finally può causare la sua uscita prematura, nel qual caso l'esecuzione salterà fuori dal finalizzatore a un ambito esterno). Se il codice prima del blocco finally viene bloccato in un ciclo infinito o in un metodo che non esce mai, o se il contesto di esecuzione viene distrutto del tutto, il blocco finally non verrà eseguito.
Nota che è corretto fare affidamento sui blocchi infine, diversamente da " Finalizza " metodi (o C # "distruttori") su cui non si deve fare correttamente affidamento.