Por que UnhandledExceptionEventArgs.ExceptionObject é um objeto e não uma exceção?


125

Por que UnhandledExceptionEventArgs.ExceptionObjectum objeto e não um Exception?

Estou me apegando AppDomain.UnhandledException.

Eu gostaria de lançar UnhandledExceptionEventArgs.ExceptionObjectum Exceptione interogê-lo.

E com isso em mente, algum dia será nulo?

A documentação do MSDN não é exatamente útil.

Obtém o objeto de exceção não tratada.

Respostas:


147

Não é possível digitar Exception porque é possível lançar objetos no .Net que não derivam de System.Exception. Isso não é possível em C # ou VB.Net, mas é possível em outros idiomas baseados em CLR. Portanto, a API deve suportar essa possibilidade e usa o objeto de tipo.

Portanto, embora nunca deva ser nulo, pode não ser de fato um System.Exception.

Consulte a seção 10.5 das especificações da CLI (especificamente a regra 40 do CLS) para obter mais detalhes


3
Graças Jared eu adicionei a sua resposta e um link de volta aqui para o conteúdo da comunidade MSDN
Simon

Então, convertê-lo para exceção em c # não será um problema? certo?
Mubashar #

1
@MubasharAhmad pode ser um problema se o tipo não for derivado System.Exception. A exceção poderia ter resultado de uma linguagem não compatível com a CLI que decide lançar a System.Int32. Novas versões do CLR irá auto-wrap isso em System.Exceptionqualquer forma, mas esta é uma configuração que pode ser desativado
JaredPar

1
@MubasharAhmad Eu recomendo que você use a conversão 'as', para que, no caso de o objeto não ser derivado do tipo Exception, a conversão padrão seja nula, em vez de lançar uma exceção.
David.barkhuizen

Por que o try-catchbloco não permite capturar objetos que não sejam Exceção?
AgentFire 16/06

78

Além do que Jared já mencionou, você pode converter com segurança Exceptionno .NET Framework 2.0 e superior se RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)tiver sido aplicado ao seu assembly (será adicionado automaticamente pelos compiladores C # e VB).

Quando esse atributo for aplicado, as "exceções" que não são de exceção serão agrupadas RuntimeWrappedException.


3
Obrigado pela informação; Eu estava lidando com isso manualmente, ou seja, envolvi-o em um RuntimeWrappedException se ele não lançasse uma exceção.
Dennis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.