Genellikle evet, sonunda koşacak.
Aşağıdaki üç senaryo için, sonunda DAİMA çalışır:
- İstisna yok
- Senkron istisnalar (normal program akışında meydana gelen istisnalar).
Bu, System.Exception özel durumundan türeyen CLS uyumlu özel durumlar ve System.Exception özel durumundan türeyen CLS uyumlu olmayan özel durumları içerir. CLS uyumlu olmayan özel durumlar RuntimeWrappedException tarafından otomatik olarak sarılır. C #, CLS dışı şikayet istisnaları alamaz, ancak C ++ gibi diller kullanabilir. C #, CLS uyumlu olmayan özel durumlar oluşturabilen bir dilde yazılmış koda çağrı yapıyor olabilir.
- Zamanuyumsuz ThreadAbortException
.NET 2.0'dan itibaren, bir ThreadAbortException bir sonun çalışmasını artık engellemez. ThreadAbortException artık nihayetten önce veya sonra kaldırılıyor. Son olarak her zaman çalışır ve iş parçacığı iptali gerçekleşmeden önce deneme girildiği sürece bir iş parçacığı iptali tarafından kesintiye uğramaz.
Aşağıdaki senaryo, sonunda çalışmaz:
Eşzamansız StackOverflowException.
.NET 2.0'dan itibaren yığın taşması işlemin sonlandırılmasına neden olur. Sonunda bir CER (Kısıtlı Yürütme Bölgesi) yapmak için başka bir kısıtlama uygulanmadıkça, sonuncu çalıştırılmaz. CER'ler genel kullanıcı kodunda kullanılmamalıdır. Yalnızca temizleme kodunun her zaman çalışmasının kritik olduğu yerlerde kullanılmalıdır - tüm işlem yine de yığın taşması üzerinde kapatıldıktan ve yönetilen tüm nesneler varsayılan olarak temizlenecektir. Bu nedenle, bir CER'nin ilgili olması gereken tek yer, işlemin dışında tahsis edilen kaynaklar, örneğin yönetilmeyen tutamaçlar içindir.
Tipik olarak, yönetilmeyen kod, kullanıcı kodu tarafından kullanılmadan önce bazı yönetilen sınıf tarafından sarılır. Yönetilen sarıcı sınıfı, yönetilmeyen tutamacı sarmak için genellikle bir SafeHandle kullanır. SafeHandle, kritik bir sonlandırıcı ve temizleme kodunun yürütülmesini garanti etmek için bir CER'de çalıştırılan bir Release yöntemini uygular. Bu nedenle, CER'lerin dışa aktarılan kullanıcı kodu tarafından çevrilmelerini görmemelisiniz.
Bu nedenle, nihayet StackOverflowException üzerinde çalışmadığı gerçeği, işlem yine de sona ereceğinden, kullanıcı kodu üzerinde hiçbir etkisi olmamalıdır. Bir SafeHandle veya CriticalFinalizerObject dışında, yönetilmeyen bazı kaynakları temizlemeniz gereken bazı uç durumunuz varsa, aşağıdaki gibi bir CER kullanın; ancak lütfen bunun kötü bir uygulama olduğunu unutmayın; yönetilmeyen kavram, yönetilen sınıf (lar) a ve uygun SafeHandle (lara) tasarıma göre soyutlanmalıdır.
Örneğin,
// 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.
}