Tôi nghĩ rằng trái tim của vấn đề là để hiểu rằng các ngoại lệ xảy ra trong một chuỗi sẽ không được chuyển đến chuỗi gọi để xử lý.
Ví dụ, nói rằng bạn có một phương pháp nổi loạn:
private static void RebelWithoutACause()
{
throw new NullReferenceException("Can't touch this!");
}
Hãy nói rằng bạn tạo ra một chủ đề mới mà các cuộc gọi phương pháp này trong chương trình của bạn, và trở thành một lập trình viên an toàn, bạn quyết định phong bì công việc trong một try/catch
khối:
private static void Main(string[] args)
{
try
{
var thread = new Thread(RebelWithoutACause);
thread.Start();
thread.Join();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
Tuy nhiên, nếu bạn chạy trong trình gỡ lỗi, bạn sẽ tìm ra rằng bạn sẽ không bao giờ đến được với các khối catch
, và thay vào đó thread sẽ bị giết chết, và các chương trình gỡ rối sẽ phàn nàn rằng bạn có một ngoại lệ chưa được giải quyết .
Bạn cần chọn cách xử lý các ngoại lệ, nhưng việc xử lý cần phải xảy ra bên trong mỗi phương thức nhập chủ đề. Xử lý điển hình bao gồm ghi nhật ký chi tiết, thông báo cho người dùng thông qua giao diện người dùng và tắt ứng dụng của bạn một cách duyên dáng nhất có thể.
Nguồn
2012-04-16 22:21:22
Lưu ý bạn nên * không bao giờ * rethrow một ngoại lệ như bạn làm ở đó. Chỉ cần làm 'ném; 'trong khối catch đủ ... – Joey
tôi biết bu i ném ngoại lệ tùy chỉnh được thừa hưởng từ" System.Exception "với thông báo – Hiyasat
Bạn phải ném một ngoại lệ * mới * với thông tin bạn muốn thêm. Vượt qua * ngoại lệ * ban đầu là InnerException. Làm điều này chỉ khi thông tin được thêm có giá trị cao vì nó giúp khắc phục sự cố khó khăn hơn. –