在例外中使用泛型

时间:2018-01-10 20:38:10

标签: c# generics exception exception-handling

所以我的问题听起来像是讨论,但事实并非如此。 我正在寻找有关该主题的消息来源,但我似乎找不到很多。

我在.Net中,可以创建一个通用异常并捕获它,即

class MyException<T> : Exception { }
// ...
catch(MyException<int> e) { }

但我注意到我无法在框架或大型图书馆中找到它。

所以我的问题是,在哪里可以找到关于这个问题的信息/讨论,如果你使用泛型的异常,你应该避免吗?

我之所以这么说是因为在我遇到过的很多场景中,从投掷者的角度来看,抛出一个带有使用泛型的细节的异常是正确的从接球手的角度来看,他们感觉很脏,以便用通用的方法来捕捉异常。

也许我对代码实践过于热心,但我真的很想找到关于这个问题的一些资料。

2 个答案:

答案 0 :(得分:0)

我要说的主要原因是异常没有绑定到类型,它们更多地与失败的动作/用法有关。

不需要ArgumentNullException<string>OverflowException<int>OveflowException<long>等内容,非通用版本就足够了。

您提出的建议只是不添加任何值,它只会增加您需要处理的其他异常类型的混乱;记住OverflowException<int>OveflowException<long>是不同的类型,你需要在一个方法中捕获它们两者中的任何一个。

此外,任何性能参数都不适用。如果您正在捕捉异常并展开堆栈,那么任何拳击都是您最不担心的......

总而言之,这似乎是一种无用的方法。

答案 1 :(得分:0)

我从一个大的&#39;中找到了一个例子。 library:WCF

FaultException<TDetail>

关键是WCF服务的客户端可能不是用.Net编写的,因此可能无法理解异常。但是,客户端将理解故障对象 - 但.Net不允许您抛出任何旧对象,因此WCF提供了一个通用的FaultException,您可以专门处理您的故障类型。当您抛出其中一个异常时,WCF将提取故障对象并将其序列化回客户端。

这是一个非常特殊的情况 - 允许将故障返回给非.Net客户端,同时仍允许.Net开发人员使用异常。我不确定你会有什么其他用例需要一般的例外但是有一个先例。

编辑: 上面也可以通过在其构造函数中包装任意对象的单个非泛型FaultException类来实现。但是,FaultException是通用的,因此,如果客户端是.Net WCF客户端,那么WCF会将其转回到正确类型的FaultException,并允许客户端捕获特定类型的故障对象,例如。

try
{
  service.DoSomething();
}
catch(FaultException<FaultType1>)
{}
catch(FaultException<FaultType2>)
{}

这允许客户端和服务器以对称和(有点)熟悉的方式编写。