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.

Simon
fonte

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

JaredPar
fonte
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.

Nicole Calinoiu
fonte
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