c# - 你能在 T 是任何类型的地方捕获异常吗?

标签 c# generics exception-handling

我希望能够捕捉到 WebFaultException<string>作为最具体的然后是WebFaultException<T> (T 是任何其他类型)作为更一般的情况来处理。这可能吗?

try
{
    // throw exception
}
catch (WebFaultException<string> e)
{
    // handle more specific type
}
catch (WebFaultException<T> e)
{
    // handle more general type
}
catch (Exception e)
{
}

最佳答案

正如其他答案所提到的;您不能直接指定捕获每个 WebFaultException<T>既不知道指定的类型参数,也不知道它的基类型。

但是,如果您想要捕获所有 WebFaultException出现并根据泛型类型以不同方式处理响应,那么您可以简单地捕获基类型并使用反射来确定泛型参数的类型,使用 Type.GetGenericArguments() .这是一个简单的 catch子句来展示你可以如何去做:

// ...

catch (FaultException ex)
{
    Type exceptionType = ex.GetType();

    if (exceptionType.IsGenericType)
    {
        // Find the type of the generic parameter
        Type genericType = ex.GetType().GetGenericArguments().FirstOrDefault();

        if (genericType != null)
        {
            // TODO: Handle the generic type.
        }
    }
}

如果你想要一个更深入的例子,我已经上传了一个测试程序来演示这个到PasteBin .随便看看吧!

关于c# - 你能在 T 是任何类型的地方捕获异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9029942/

相关文章:

c# - 如何使用 Unity 为手机制作 2D 横向卷轴游戏

c# - 网络场的网络负载平衡器是否受到 GC 压力的影响?

c# - 将选定的 T 属性从一个 IQueryable<T> 获取到一个 IQueryable<MyClass>

c# - 从最低到最高显示一系列数字

c# - List.Insert 有任何性能损失吗?

JavaScript 异常列表

c++ - 如果构造函数中抛出异常,防止内存泄漏的最佳做法是什么?

php - 在 PHPUnit 异常上禁用堆栈跟踪

java - 当您可以只使用具体类型时,为什么会有带有上限的通配符?

java - java中的泛型方法可以限制可接受的类型吗?