Umumnya ya, akhirnya akan berjalan.
Untuk tiga skenario berikut, akhirnya akan SELALU berjalan:
- Tidak ada pengecualian
- Pengecualian sinkron (pengecualian yang terjadi dalam aliran program normal).
Ini termasuk pengecualian yang sesuai dengan CLS yang berasal dari System.Exception dan pengecualian yang tidak sesuai dengan CLS, yang tidak berasal dari System.Exception. Pengecualian yang tidak memenuhi CLS secara otomatis dibungkus oleh RuntimeWrappedException. C # tidak bisa melempar pengecualian keluhan non-CLS, tetapi bahasa seperti C ++ bisa. C # dapat memanggil kode yang ditulis dalam bahasa yang dapat membuang pengecualian yang tidak sesuai dengan CLS.
- Asynchronous ThreadAbortException
Pada. NET 2.0, sebuah ThreadAbortException tidak lagi mencegah akhirnya menjalankan. ThreadAbortException sekarang diangkat ke sebelum atau sesudah akhirnya. Akhirnya akan selalu berjalan dan tidak akan terganggu oleh utas yang dibatalkan, selama upaya tersebut benar-benar dimasukkan sebelum utas yang dibatalkan terjadi.
Skenario berikut, akhirnya tidak akan berjalan:
StackOverflowException Asynchronous.
Pada. NET 2.0 stack overflow akan menyebabkan proses berakhir. Akhirnya tidak akan dijalankan, kecuali kendala lebih lanjut diterapkan untuk membuat akhirnya CER (Constrained Execution Region). CER tidak boleh digunakan dalam kode pengguna umum. Mereka hanya boleh digunakan di mana sangat penting bahwa kode pembersihan selalu dijalankan - setelah semua proses ditutup pada stack overflow dan semua objek yang dikelola karenanya akan dibersihkan secara default. Dengan demikian, satu-satunya tempat CER harus relevan adalah untuk sumber daya yang dialokasikan di luar proses, misalnya, pegangan yang tidak dikelola.
Biasanya, kode yang tidak dikelola dibungkus oleh beberapa kelas terkelola sebelum dikonsumsi oleh kode pengguna. Kelas pembungkus yang dikelola biasanya akan menggunakan SafeHandle untuk membungkus pegangan yang tidak dikelola. SafeHandle mengimplementasikan finalizer kritis, dan metode Release yang dijalankan dalam CER untuk menjamin eksekusi kode pembersihan. Untuk alasan ini, Anda seharusnya tidak melihat CER berserakan melalui kode pengguna.
Jadi fakta bahwa akhirnya tidak berjalan di StackOverflowException seharusnya tidak berpengaruh pada kode pengguna, karena prosesnya akan tetap berakhir. Jika Anda memiliki beberapa kasus tepi di mana Anda perlu membersihkan beberapa sumber daya yang tidak dikelola, di luar SafeHandle atau CriticalFinalizerObject, kemudian gunakan CER sebagai berikut; tetapi harap dicatat, ini adalah praktik yang buruk - konsep yang tidak dikelola harus diabstraksi menjadi kelas yang dikelola dan desain SafeHandle yang sesuai.
misalnya,
// 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.
}