Як правило, так, нарешті, побіжить.
Для наступних трьох сценаріїв, нарешті, ЗАВЖДИ запуститься:
- Винятків не відбувається
- Синхронні винятки (винятки, що трапляються в нормальному потоці програми).
Сюди входять винятки, сумісні з CLS, які випливають із винятків, сумісних із системою System.Exception, та винятків, що не відповідають CLS, які не походять від System.Exception. Винятки, що не відповідають стандартам CLS, автоматично завершуються RuntimeWrappedException. C # не може викидати скарги, що не стосуються CLS, але такі мови, як C ++, можуть. C # може вводити код, написаний мовою, яка може кидати винятки, що не відповідають стандартам CLS.
- Асинхронна ThreadAbortException
Станом на .NET 2.0, ThreadAbortException більше не заважатиме остаточно запуститися. ThreadAbortException тепер піднімається до або після остаточно. Нарешті завжди буде працювати і не буде перервано потоком переривання потоку, доки спроба була фактично введена до того, як відбудеться переривання потоку.
Наступний сценарій, нарешті, не запуститься:
Асинхронний StackOverflowException.
Станом на .NET 2.0 переповнення стека призведе до припинення процесу. Остаточно не буде запущено, якщо не буде застосовано додаткового обмеження, щоб зробити нарешті СЕР (область обмеженого виконання). СЕР не слід використовувати в загальному коді користувача. Їх слід використовувати лише там, коли критично важливо, щоб код очищення завжди виконувався - адже процес все-таки вимикається з переповненням стека і тому всі керовані об'єкти будуть очищені за замовчуванням. Таким чином, єдине місце, на яке СЕР повинен бути актуальним, - це ресурси, які виділяються поза процесом, наприклад, некеровані ручки.
Зазвичай некерований код обгортається деяким керованим класом перед тим, як його використовуватиме код користувача. Клас керованої обгортки зазвичай використовує SafeHandle для загортання керованої ручки. SafeHandle реалізує критичний фіналізатор та метод випуску, який запускається в CER, щоб гарантувати виконання коду очищення. З цієї причини ви не повинні бачити CERs, засмічений кодом користувача.
Отже, той факт, що нарешті не працює на StackOverflowException, не повинен впливати на код користувача, оскільки процес все одно закінчиться. Якщо у вас є певний крайній випадок, коли вам потрібно очистити якийсь некерований ресурс, поза SafeHandle або CriticalFinalizerObject, тоді використовуйте CER наступним чином; але зауважте, це погана практика - некерована концепція повинна бути абстрагована для керованого класу та відповідних SafeHandle (-ів) за задумом.
наприклад,
// 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.
}