Nói chung là có, cuối cùng sẽ chạy.
Đối với ba kịch bản sau đây, cuối cùng sẽ LUÔN chạy:
- Không có ngoại lệ xảy ra
- Ngoại lệ đồng bộ (ngoại lệ xảy ra trong luồng chương trình bình thường).
Điều này bao gồm các ngoại lệ tuân thủ CLS xuất phát từ ngoại lệ System.Exception và không tuân thủ CLS, không xuất phát từ System.Exception. Các ngoại lệ không tuân thủ CLS được tự động bao bọc bởi RuntimeWrappingException. C # không thể đưa ra các ngoại lệ khiếu nại không phải CLS, nhưng các ngôn ngữ như C ++ thì có thể. C # có thể được gọi vào mã được viết bằng ngôn ngữ có thể đưa ra các ngoại lệ không tuân thủ CLS.
- ThreadAdortException không đồng bộ
Kể từ .NET 2.0, một ThreadAdortException sẽ không còn ngăn được cuối cùng chạy. ThreadAdortException bây giờ được kéo lên trước hoặc sau cuối cùng. Cuối cùng sẽ luôn luôn chạy và sẽ không bị gián đoạn bởi một hủy bỏ luồng, miễn là thử thực sự được nhập trước khi hủy bỏ luồng xảy ra.
Kịch bản sau đây, cuối cùng sẽ không chạy:
StackOverflowException không đồng bộ.
Kể từ .NET 2.0, tràn ngăn xếp sẽ khiến quá trình chấm dứt. Cuối cùng sẽ không được chạy, trừ khi áp dụng một ràng buộc hơn nữa để biến cuối cùng thành CER (Vùng thực thi bị ràng buộc). CER không nên được sử dụng trong mã người dùng chung. Chúng chỉ nên được sử dụng khi điều quan trọng là mã dọn dẹp luôn chạy - sau khi tất cả quá trình sẽ tắt khi tràn ngăn xếp và do đó tất cả các đối tượng được quản lý sẽ được dọn sạch theo mặc định. Do đó, nơi duy nhất CER có liên quan là dành cho các tài nguyên được phân bổ ngoài quy trình, ví dụ: các thẻ điều khiển không được quản lý.
Thông thường, mã không được quản lý được bao bọc bởi một số lớp được quản lý trước khi được sử dụng bởi mã người dùng. Lớp trình bao bọc được quản lý thường sẽ sử dụng SafeHandle để bọc tay cầm không được quản lý. SafeHandle thực hiện một bộ hoàn thiện quan trọng và phương thức Phát hành được chạy trong CER để đảm bảo thực thi mã dọn dẹp. Vì lý do này, bạn không nên thấy các CER rải rác mã người dùng.
Vì vậy, thực tế là cuối cùng không chạy trên StackOverflowException sẽ không ảnh hưởng đến mã người dùng, vì dù sao quá trình sẽ chấm dứt. Nếu bạn có một số trường hợp cạnh mà bạn cần phải dọn sạch một số tài nguyên không được quản lý, bên ngoài SafeHandle hoặc CriticalFinalizerObject, thì hãy sử dụng CER như sau; nhưng xin lưu ý, đây là cách thực hành tồi - khái niệm không được quản lý nên được trừu tượng hóa thành một lớp được quản lý và (các) SafeHandle thích hợp theo thiết kế.
ví dụ,
// 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.
}