Tại sao UnhandledExceptionEventArss.ExceptionObject là một đối tượng mà không phải là Ngoại lệ?


125

Tại sao là UnhandledExceptionEventArgs.ExceptionObjectmột đối tượng mà không phải là một Exception?

Tôi đang gắn bó với AppDomain.UnhandledException.

Tôi muốn đúc UnhandledExceptionEventArgs.ExceptionObjectmột Exceptionvà interogate nó.

Và với điều này trong tâm trí nó sẽ bao giờ là null?

Các tài liệu MSDN là không exatly hữu ích.

Được các đối tượng ngoại lệ không được xử lý.

Câu trả lời:


147

Điều này không thể được nhập vào Ngoại lệ vì có thể ném các đối tượng vào .Net không xuất phát từ System.Exception. Điều này là không thể trong C # hoặc VB.Net nhưng nó có thể có trong các ngôn ngữ dựa trên CLR khác. Do đó API phải hỗ trợ khả năng này và sử dụng đối tượng loại.

Vì vậy, mặc dù nó không bao giờ là null, nhưng thực tế nó có thể không phải là System.Exception.

Xem phần thông số kỹ thuật CLI 10.5 (cụ thể là quy tắc CLS 40) để biết thêm chi tiết


3
Cảm ơn Jared tôi đã thêm câu trả lời của bạn và một liên kết quay lại đây vào nội dung cộng đồng msDN
Simon

Vì vậy, việc chuyển nó thành Ngoại lệ trong C # sẽ không thành vấn đề? đúng?
Mubashar

1
@MubasharAhmad có thể là một vấn đề nếu loại không xuất phát từ System.Exception. Ngoại lệ có thể xảy ra do ngôn ngữ không tuân thủ CLI quyết định ném System.Int32. Các phiên bản mới hơn của CLR sẽ tự động bọc này trong mọi trường hợp System.Exceptionnhưng đây là cài đặt có thể bị tắt
JaredPar

1
@MubasharAhmad Tôi khuyên bạn nên sử dụng cast 'as', để trong trường hợp đối tượng không xuất phát từ loại Exception, cast mặc định là null, thay vì ném ngoại lệ.
david.barkhuizen

Tại sao sau đó try-catchkhối không cho phép bắt các đối tượng không ngoại lệ?
AgentFire

78

Ngoài những gì Jared đã đề cập, bạn có thể chuyển sang Exception.NET Framework 2.0 một cách an toàn và cao hơn nếu RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)đã được áp dụng cho hội đồng của bạn (sẽ được trình biên dịch C # và VB tự động thêm vào).

Khi thuộc tính này đã được áp dụng, các "ngoại lệ" không ngoại lệ sẽ được gói gọn trong RuntimeWrappedException.


3
Cảm ơn bạn đã thông tin; Tôi đã xử lý việc này một cách thủ công, tức là, gói nó trong RuntimeWrappingException nếu nó không tạo ra ngoại lệ.
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.