2010-07-09 27 views
20

Sự khác nhau giữa AppDomain.UnhandledExceptionApplication.DispatcherUnhandledException trong .NET là gì?Sự khác biệt giữa UnhandledException và DispatcherUnhandledException trong .NET

Tôi cần sự kiện phát sinh khi xảy ra bất kỳ ngoại lệ không được giải quyết nào. Tôi đã bắt gặp hai điều này, nhưng tôi không biết chúng khác nhau như thế nào. Ngoài ra, có trường hợp khi họ không bị sa thải?

Trả lời

11

Application.DispatcherUnhandledException sẽ xử lý ngoại lệ được ném trên chuỗi giao diện người dùng chính trong ứng dụng WPF. AppDomain.UnhandledException sẽ xử lý các ngoại lệ được ném trên bất kỳ chuỗi nào và không bao giờ bị bắt. Điều này bao gồm các chủ đề bạn tạo thủ công hoặc chuỗi chính trong ứng dụng Bảng điều khiển. WPF đang nắm bắt các ngoại lệ trên chuỗi giao diện người dùng, vì vậy bạn sẽ không thấy các trường hợp đó trong AppDomain.UnhandledException.

Cũng lưu ý rằng ngoại lệ không được giải quyết thường chấm dứt thời gian chạy, vì vậy sau khi AppDomain.UnhandledException được nâng lên, chương trình của bạn sẽ thoát ngay lập tức. Ngược lại, Application.DispatcherUnhandledException đang bắt ngoại lệ và sẽ cho phép chương trình của bạn tiếp tục.

+7

thực sự khi Application.DispatcherUnhandledException không được sử dụng, những ngoại lệ đó sẽ hiển thị trong AppDomain.UnhandledException và ứng dụng sẽ thoát ngay lập tức. – stijn

+0

Ứng dụng sẽ không tồn tại nếu ngoại lệ bị bắt và xử lý.Cả hai câu trả lời và bình luận ngụ ý rằng một trong hai cách ứng dụng sẽ thoát ra là sai. – vikp

2

http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx

nói:

"DispatcherUnhandledException được nâng lên bởi một ứng dụng cho từng trường hợp ngoại lệ là unhandled bởi mã chạy trên thread UI chính."

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

nói:

"Sự kiện này có thể được xử lý trong bất kỳ lĩnh vực ứng dụng Tuy nhiên, sự kiện này không nhất thiết phải huy động trong lĩnh vực ứng dụng nơi mà các ngoại lệ xảy ra.."

Vì vậy, DispatcherUnhandledException là dành cho ngoại lệ cho chuỗi giao diện người dùng và AppDomain.UnhandledException dành cho mọi thứ khác.

Hy vọng điều đó sẽ hữu ích!

8

DispatcherUnhandledException chỉ được nâng lên bởi chuỗi giao diện người dùng và chỉ khi ngoại lệ được nâng lên khi chạy một sự kiện. Có một chút của một truyền thống để xử lý các loại ngoại lệ đặc biệt, Windows Forms có nó quá với Application.ThreadException (kém tên, không có gì để làm với chủ đề).

Lý do là có một cơ hội nhỏ để xử lý ngoại lệ và giữ cho chương trình còn hoạt động vì trình xử lý sự kiện UI không phải lúc nào cũng làm thay đổi trạng thái của chương trình quá đáng kể. Điều này giúp ích rất nhiều cho việc suy nghĩ mơ hồ. Windows Forms đưa điều này đến mức cực đoan, nó hiển thị một ThreadExceptionDialog có nút Continue, cho phép người dùng bỏ qua ngoại lệ. WPF không làm điều đó, bạn phải viết một hộp thoại như thế. Đó là lý do tại sao sự kiện ở đó.

Hành động mặc định của DispatcherUnhandledException là không bắt ngoại lệ. Vì vậy, bạn không sao để bỏ qua nó, AppDomain.UnhandledException sẽ kích hoạt tiếp theo.

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