Generalmente sì, finalmente verrà eseguito.
Per i seguenti tre scenari, finalmente verrà eseguito SEMPRE :
- Non si verificano eccezioni
- Eccezioni sincrone (eccezioni che si verificano nel normale flusso del programma).
Ciò include le eccezioni conformi a CLS che derivano da System.Exception e le eccezioni non conformi a CLS, che non derivano da System.Exception. Le eccezioni non conformi a CLS vengono automaticamente racchiuse da RuntimeWrappedException. C # non può generare eccezioni di reclamo non CLS, ma possono farlo linguaggi come C ++. C # potrebbe chiamare il codice scritto in una lingua che può generare eccezioni non conformi a CLS.
- ThreadAbortException asincrona
A partire da .NET 2.0, ThreadAbortException non impedisce più l'esecuzione di. ThreadAbortException è ora sollevato prima o dopo il fine. L'elaborazione finale verrà sempre eseguita e non verrà interrotta da un'interruzione del thread, purché il tentativo sia stato effettivamente inserito prima dell'interruzione del thread.
Il seguente scenario, finalmente non verrà eseguito:
StackOverflowException asincrono.
A partire da .NET 2.0 un overflow dello stack farà terminare il processo. L'ultimo non verrà eseguito, a meno che non venga applicato un ulteriore vincolo per rendere finalmente un CER (Constrained Execution Region). I CER non devono essere utilizzati nel codice utente generale. Dovrebbero essere usati solo laddove è fondamentale che il codice di pulizia venga sempre eseguito, dopo che tutto il processo viene comunque interrotto in caso di overflow dello stack e tutti gli oggetti gestiti verranno quindi ripuliti per impostazione predefinita. Pertanto, l'unico posto in cui una CER dovrebbe essere pertinente è per le risorse che sono allocate al di fuori del processo, ad esempio, handle non gestiti.
In genere, il codice non gestito viene racchiuso da una classe gestita prima di essere utilizzato dal codice utente. La classe wrapper gestita in genere utilizzerà un SafeHandle per avvolgere l'handle non gestito. SafeHandle implementa un finalizzatore critico e un metodo di rilascio che viene eseguito in un CER per garantire l'esecuzione del codice di pulizia. Per questo motivo, non dovresti vedere i CER disseminati nel codice utente.
Quindi il fatto che finalmente non venga eseguito su StackOverflowException non dovrebbe avere alcun effetto sul codice utente, poiché il processo verrà comunque terminato. Se si dispone di un caso limite in cui è necessario ripulire alcune risorse non gestite, al di fuori di SafeHandle o CriticalFinalizerObject, utilizzare un CER come segue; ma tieni presente che si tratta di una cattiva pratica: il concetto non gestito dovrebbe essere estratto in una (e) classe (i) gestita e SafeHandle (s) appropriato in base alla progettazione.
per esempio,
// No code can appear after this line, before the try
RuntimeHelpers.PrepareConstrainedRegions();
try
{
// This is *NOT* a CER
}
finally
{
// This is a CER; guaranteed to run, if the try was entered,
// even if a StackOverflowException occurs.
}