2009-05-27 49 views
117

Tại sao là UnhandledExceptionEventArgs.ExceptionObject một đối tượng chứ không phải là Exception?Tại sao UnhandledExceptionEventArgs.ExceptionObject đối tượng chứ không phải ngoại lệ?

Tôi đang đính kèm vào AppDomain.UnhandledException.

Tôi muốn truyền UnhandledExceptionEventArgs.ExceptionObject đến Exeption và tương tác với nó.

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

MSDN documentation không hữu ích.

Nhận đối tượng ngoại lệ chưa được xử lý.

Trả lời

135

Không thể nhập ngoại lệ này vì có thể ném đối tượng vào .Net không lấy được từ System.Exception. Điều này là không thể trong C# hoặc VB.Net nhưng nó có thể 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 kiểu.

Vì vậy, mặc dù nó không bao giờ được rỗng, nhưng nó có thể không thực sự là một System.Exception.

Xem CLI phần đặc tả 10,5 (cụ thể là CLS quy tắc 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à liên kết quay lại đây với nội dung cộng đồng msdn – Simon

+0

Vì vậy, hãy đưa nó vào Ngoại lệ trong C# sẽ không thành vấn đề? đúng? –

+1

@MubasharAhmad nó có thể là một vấn đề nếu loại không bắt nguồn từ 'System.Exception'. Ngoại lệ có thể là kết quả của một ngôn ngữ không tuân thủ CLI quyết định ném một 'System.Int32'. Các phiên bản mới hơn của CLR sẽ tự động quấn nó trong 'System.Exception' anyways nhưng đây là một thiết lập có thể bị vô hiệu hóa – JaredPar

73

Ngoài những gì Jared đã đề cập, bạn có thể yên tâm đúc để Exception trong .NET Framework 2.0 và cao hơn nếu RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true) đã được áp dụng để lắp ráp của bạn (sẽ được bổ sung tự động bởi trình biên dịch C# và VB).

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

+3

Cảm ơn bạn đã cung cấp thông tin; Tôi đã xử lý thủ công điều này, tức là, gói nó trong một RuntimeWrappedException nếu nó không thể bỏ một ngoại lệ. – Dennis

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