【问题标题】:How to locate a particular exception in a Exception stack如何在异常堆栈中定位特定异常
【发布时间】:2009-03-19 11:29:05
【问题描述】:

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

所以让我们假设ex.InnerException.InnerException.InnerException 的类型是“SomeException

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

例子:

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

【问题讨论】:

  • 我认为没有,因为您可能不想这样做。为什么要以如此复杂的方式处理异常?
  • 我以前需要这样做,试图在堆栈中的某处找到一种特定类型的 Oracle 异常,该异常的深度取决于原因。

标签: c# api exception logic


【解决方案1】:

不,我不相信有任何内置的方法可以做到这一点。不过写起来并不难:

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,您可以将其设为扩展方法(只需将参数设为“this Exception outer”),使用起来会更好:

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

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

【讨论】:

    【解决方案2】:

    只有 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);
        }
    

    【讨论】:

    • 如果它应该进行递归,您可能需要确定是调用它 Contains 还是 LocateExceptionInStack...
    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 2010-10-19
    • 2014-07-18
    • 2010-11-27
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多