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));
Foi útil?

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
scroll top