2012-06-11 33 views
5

Khi đăng ký các sự kiện trên AppDomain.CurrentDomain.UnhandledException tiêu chí nào gây ra cờ UnhandledExceptionEventArgsIsTerminating là đúng? I E. những gì gây ra một ngoại lệ được coi là gây tử vong?Điều gì gây ra cờ UnhandledExceptionEventArgs.IsTerminating là đúng hay sai?

Có phải trường hợp mặc định tất cả các trường hợp ngoại lệ chưa được xử lý sẽ bị tử vong trừ khi được định cấu hình khác?

Trả lời

7

Thuộc tính này luôn đúng. Nó được sử dụng để có thể là sai, cách trở lại trong NET 1.x ngày. Phiên bản đó cho phép một chuỗi chết trên một ngoại lệ chưa được giải quyết mà không có toàn bộ quá trình chấm dứt. Điều đó đã không hoạt động tốt, các lập trình viên đã không thực hiện xử lý sự kiện (hoặc không biết cách xử lý đúng đắn ngoại lệ từ sự kiện này), những chủ đề vừa chết mà không có bất kỳ thông báo nào. Hầu như không thể không có nguyên nhân này khó chẩn đoán thất bại chương trình.

Microsoft đã thay đổi hành vi mặc định trong .NET 2.0, ngoại lệ chưa được xử lý chấm dứt chương trình. Về mặt kỹ thuật, nó vẫn có thể ghi đè hành vi này, một máy chủ CLR tùy chỉnh có thể giữ cho quá trình còn sống bằng cách triển khai giao diện IHostPolicyManager. Và máy chủ lưu trữ mặc định hỗ trợ phần tử cấu hình <legacyUnhandledExceptionPolicy>. Đừng sử dụng nó, theo cách đó thì con rồng.

+0

Chỉ đơn giản là thử, tôi có thể thấy rằng cùng một ngoại lệ unhanded (ví dụ: InvalidDataException) có IsTerminating được đặt thành true khi được thực hiện trong ứng dụng, nhưng nó được đặt thành false khi cùng một mã được thực hiện trong kiểm tra đơn vị (vstest.executionengine. exe của VS2017). –

3

Không, các ngoại lệ chưa được xử lý từ chuỗi được quản lý sinh ra bởi một ứng dụng khác sẽ có IsTerminating bằng false, vì nó sẽ giết luồng chứ không phải ứng dụng tổng thể. Đó là lần duy nhất tôi từng thấy IsTerminating false trong tình huống này, và MSDN page nói rằng đây cũng là trường hợp sử dụng chính.

0

Tôi đã sử dụng nó cho mục đích thử nghiệm. Tôi muốn kiểm tra UnhandledExceptionHandler của tôi ghi nhật ký các ngoại lệ. Vì vậy, tôi đặt nó để tôi có thể đăng nhập tin nhắn nhưng không bắn xuống chuỗi thử nghiệm.

Nhưng thông thường, điều này có nghĩa là trong tất cả các tình huống khác mà tôi đã thấy, cờ IsTerminating được đặt thành true.

Các vấn đề liên quan