Trình hoàn thành luôn được gọi bởi khung .net, do đó chuỗi có thể nằm ngoài tầm kiểm soát; và thậm chí nếu constructor thất bại, destructor vẫn có thể được kích hoạt.C#: Làm thế nào để xử lý các ngoại lệ finalizer từ thư viện của bên thứ 3?
Điều này có thể mang lại những rắc rối, khi ngoại lệ của trình hoàn tất đó đến từ thư viện của bên thứ ba: Tôi không thể tìm cách xử lý chúng! Ví dụ, trong đoạn code dưới đây, mặc dù constructor lớp A luôn ném một ngoại lệ và thất bại, finalizer của A sẽ được kích hoạt bởi khung .net, cũng ~ B() được gọi là A có thuộc tính kiểu B .
class Program // my code
{
static void Main(string[] args)
{
A objA;
try
{
objA = new A();
}
catch (Exception)
{
}
; // when A() throws an exception, objA is null
GC.Collect(); // however, this can force ~A() and ~B() to be called.
Console.ReadLine();
}
}
public class A // 3rd-party code
{
public B objB;
public A()
{
objB = new B(); // this will lead ~B() to be called.
throw new Exception("Exception in A()");
}
~A() // called by .net framework
{
throw new Exception("Exception in ~A()"); // bad coding but I can't modify
}
}
public class B // 3rd-party code
{
public B() { }
~B() // called by .net framework
{
throw new Exception("Exception in ~B()"); // bad coding but I can't modify
}
}
Nếu đây là mã của tôi, nó là một chút dễ dàng hơn - Tôi có thể sử dụng try-catch trong finalizers, ít nhất tôi có thể làm một số khai thác gỗ - Tôi có thể cho phép các ngoại lệ sụp đổ chương trình, để khám phá các lỗi asap - hoặc nếu tôi muốn "chịu đựng" ngoại lệ, tôi có thể có một thử-catch để ngăn chặn các ngoại lệ, và có một lối ra duyên dáng.
Nhưng nếu A và B là các lớp học từ thư viện của bên thứ ba, tôi không thể làm gì cả! Tôi không thể kiểm soát ngoại lệ xảy ra, tôi không thể bắt chúng, vì vậy tôi không thể đăng nhập hoặc ngăn chặn nó!
Tôi có thể làm gì?
+1 Sự cố thú vị (và trong khi chờ đợi, hãy báo cáo lỗi khẩn cấp với các nhà cung cấp thư viện cung cấp 'A' và' B'). – Ergwun
^^ - Điểm tuyệt vời. Cần phải là một câu trả lời thực tế. –