Como localizar uma exceção especial em uma pilha de exceção
Pergunta
Vamos supor que uma exceção especial "SomeException
" faz parte da pilha de exceção,
então vamos assumir ex.InnerException.InnerException.InnerException
é do tipo "SomeException
"
Existe alguma built-in API em C # que irá tentar localizar um determinado tipo de exceção na pilha de exceção?
Exemplo:
SomeException someExp = exp.LocateExceptionInStack(typeof(SomeException));
Solução
Não, eu não acredito que haja qualquer construído em forma de fazê-lo. Não é difícil escrever que:
public static T LocateException<T>(Exception outer) where T : Exception
{
while (outer != null)
{
T candidate = outer as T;
if (candidate != null)
{
return candidate;
}
outer = outer.InnerException;
}
return null;
}
Se você estiver usando C # 3, você pode torná-lo um método de extensão (basta fazer o parâmetro "Essa exceção externa") e seria ainda mais agradável de usar:
SomeException nested = originalException.Locate<SomeException>();
(Note o encurtamento do nome do bem - ajustar ao seu próprio gosto:)
Outras dicas
É apenas 4 linhas de código:
public static bool Contains<T>(Exception exception)
where T : Exception
{
if(exception is T)
return true;
return
exception.InnerException != null &&
LocateExceptionInStack<T>(exception.InnerException);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow