เหตุใด UnhandledExceptionEventArgs.ExceptionObject จึงเป็นอ็อบเจ็กต์ไม่ใช่ Exception


127

ทำไมUnhandledExceptionEventArgs.ExceptionObjectวัตถุถึงไม่ใช่Exception?

ฉันติดอยู่กับAppDomain.UnhandledException.

ผมอยากจะโยนUnhandledExceptionEventArgs.ExceptionObjectไปยังExceptionและ interogate มัน

และด้วยเหตุนี้มันจะเป็นโมฆะหรือไม่?

MSDN เอกสารไม่เป็นประโยชน์ exatly

รับวัตถุข้อยกเว้นที่ไม่สามารถจัดการได้

คำตอบ:


149

ไม่สามารถพิมพ์เป็น Exception ได้เนื่องจากสามารถโยนวัตถุใน. Net ที่ไม่ได้มาจาก System.Exception ไม่สามารถทำได้ใน C # หรือ VB.Net แต่เป็นไปได้ในภาษาที่ใช้ CLR อื่น ๆ ดังนั้น API ต้องรองรับความเป็นไปได้นี้และใช้ออบเจ็กต์ประเภท

ดังนั้นแม้ว่าจะไม่ควรเป็นโมฆะ แต่ก็อาจไม่ใช่ System.Exception ก็ได้

ดูข้อมูลจำเพาะ CLI ส่วน 10.5 (เฉพาะกฎ CLS 40) สำหรับรายละเอียดเพิ่มเติม


3
ขอบคุณ Jared ฉันได้เพิ่มคำตอบของคุณและลิงก์กลับไปที่เนื้อหาชุมชน msdn ที่นี่
Simon

ดังนั้นการแคสต์ให้เป็น Exception ใน C # จะไม่มีปัญหา? ขวา?
Mubashar

1
@MubasharAhmad System.Exceptionมันอาจจะมีปัญหาหากประเภทที่ไม่ได้มาจาก ข้อยกเว้นอาจเป็นผลมาจากภาษาที่ไม่สอดคล้องกับ CLI ซึ่งตัดสินใจที่จะส่งไฟล์System.Int32. CLR เวอร์ชันใหม่กว่าจะตัดสิ่งนี้โดยอัตโนมัติSystem.Exceptionแต่เป็นการตั้งค่าที่สามารถปิดใช้งานได้
JaredPar

1
@Mubashar Ahmad ฉันขอแนะนำให้คุณใช้การร่าย 'as' ดังนั้นในกรณีที่วัตถุไม่ได้มาจากประเภท Exception การร่ายจะมีค่าเริ่มต้นเป็น null แทนที่จะโยนข้อยกเว้น
david.barkhuizen

เหตุใดtry-catchบล็อกจึงไม่อนุญาตให้จับวัตถุที่ไม่ใช่ข้อยกเว้น
AgentFire

80

นอกเหนือจากสิ่งที่ Jared ได้กล่าวไปแล้วคุณสามารถส่งไปยังException. NET Framework 2.0 และสูงกว่าได้อย่างปลอดภัยหากRuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)ถูกนำไปใช้กับแอสเซมบลีของคุณ (จะถูกเพิ่มโดยอัตโนมัติโดยคอมไพเลอร์ C # และ VB)

เมื่อแอตทริบิวต์นี้ได้ถูกนำไปใช้ที่ไม่ใช่ข้อยกเว้น "ข้อยกเว้น" RuntimeWrappedExceptionจะถูกห่อใน


3
ขอขอบคุณสำหรับข้อมูล; ฉันจัดการสิ่งนี้ด้วยตนเองกล่าวคือห่อไว้ใน RuntimeWrappedException หากไม่สามารถส่งข้อยกเว้นได้
Dennis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.