如何在Exception堆栈中查找特定异常

时间:2009-03-19 11:29:05

标签: c# api exception logic

让我们假设一个特定的异常“SomeException”是异常堆栈的一部分,

因此,我们假设ex.InnerException.InnerException.InnerException的类型为“SomeException

C#中是否有任何内置API会尝试在异常堆栈中找到给定的异常类型?

示例:

SomeException someExp = exp.LocateExceptionInStack(typeof(SomeException));

2 个答案:

答案 0 :(得分:6)

不,我不相信有任何内置方式。不过写起来并不难:

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;
}

如果你正在使用C#3,你可以使它成为一个扩展方法(只需将参数设置为“此异常外部”)并且使用它会更好:

SomeException nested = originalException.Locate<SomeException>();

(注意缩短名称 - 根据自己的喜好调整:)

答案 1 :(得分:1)

这只是4行代码:

    public static bool Contains<T>(Exception exception)
        where T : Exception
    {
        if(exception is T)
            return true;

        return 
            exception.InnerException != null && 
            LocateExceptionInStack<T>(exception.InnerException);
    }