UnhandledExceptionEventArgs.ExceptionObject가 예외가 아닌 객체 인 이유는 무엇입니까?


126

UnhandledExceptionEventArgs.ExceptionObject객체 가 아닌 이유는 무엇 Exception입니까?

에 첨부하고 AppDomain.UnhandledException있습니다.

에 캐스팅 UnhandledExceptionEventArgs.ExceptionObject하여 조사하고 싶습니다 Exception.

그리고 이것을 염두에두면 null이 될까요?

MSDN 설명서 exatly 유용하지 않습니다.

처리되지 않은 예외 개체를 가져옵니다.

답변:


148

System.Exception에서 파생되지 않은 .Net에서 개체를 throw 할 수 있으므로 Exception에 형식화 할 수 없습니다. C # 또는 VB.Net에서는 불가능하지만 다른 CLR 기반 언어에서는 가능합니다. 따라서 API는 이러한 가능성을 지원하고 유형 객체를 사용해야합니다.

따라서 null이 아니어야하지만 실제로 System.Exception이 아닐 수도 있습니다.

자세한 내용은 CLI 사양 섹션 10.5 (특히 CLS 규칙 40)를 참조하십시오.


3
감사합니다 Jared 귀하의 답변과 msdn 커뮤니티 콘텐츠에 대한 링크를 여기에 추가했습니다
Simon

따라서 C #에서 Exception으로 캐스팅하는 것이 문제가되지 않습니까? 권리?
Mubashar 2013

1
@MubasharAhmad 유형이에서 파생되지 않으면 문제가 될 수 있습니다 System.Exception. .NET Framework를 throw하기로 결정한 비 CLI 호환 언어로 인해 예외가 발생할 수 있습니다 System.Int32. 최신 버전의 CLR은이를 자동으로 래핑 System.Exception하지만 비활성화 할 수있는 설정입니다
JaredPar

1
@MubasharAhmad 객체가 Exception 유형에서 파생되지 않은 경우 캐스트가 예외를 발생시키는 대신 null로 기본 설정되도록 'as'캐스트를 사용하는 것이 좋습니다.
david.barkhuizen

그렇다면 try-catch블록이 예외가 아닌 객체를 잡을 수없는 이유는 무엇 입니까?
AgentFire

79

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.