为什么.Net中没有System.ClassNotFoundException?

时间:2010-01-14 04:02:03

标签: .net exception reflection

在运行时尝试查找Type(通常是类)时,如果名称传递给

  Type.GetType(string typeName, bool throwOnError = True)

无法定位重载,引发的异常是TypeLoadException。

我理解这背后的想法是CLR认为问题在于我们还没有(还)加载包含所寻求类型的(或任何)程序集,但我想到的方式就是问题是CLR无法找到给出其名称的类。 (当然,这个名字可能是错误拼写的。)

似乎我有两个选择,如果我想告诉客户我的面向反射的定义 - 代码 - 运行时工具,他们要求的类没有找到 - 要么用TypeLoadException告诉他们,要么定义我自己的ClassNotFoundException。

我发现this link提供了有关创建自定义异常类(在C#中)的信息(显然很好且肯定是完整的),但这对于(正确实现)这样一个简单的想法来说是相当多的工作。

看来我还想构建一些知道我认为我的客户可能想要使用的公共类(或它们的名称空间)的程序集名称的东西,以便我可以在我的用户/当我的用户时加载正确的程序集要求在一个有点知名但尚未装载的装配中的类。这也似乎是BCL可能为我们提供的一个蠢货。 (我想这就是AppDomain.TypeResolve事件的用途,但我会问一个单独的问题,试图找到一个易于重用且可扩展的概念实现。)

与此同时,我再问一遍 - 为什么不定义ClassNotFoundException?

2 个答案:

答案 0 :(得分:4)

如果您的自定义TypeNotFoundException提供的信息多于CLR的TypeLoadException提供的信息,那么我认为创建新的异常类型是完全可以接受的。

需要考虑的一件事是,您是否需要使用已经尝试捕获CLR的TypeLoadException的现有代码进行操作。如果是这样,那么该代码可能不再有效,因为该代码不会捕获您的异常。

我只能猜测为什么CLR的异常是为什么它是因为我没有写那个代码。例外情况不一定能够准确地检测出无法找到类型的原因。如您所述,一种可能性是类型名称拼写错误。其他原因可能是安全性要求失败,无法从磁盘读取程序集文件,找到错误的程序集版本,公钥不匹配,程序集不在探测路径中,AppDomain的类型解析程序失败,或者任何其他原因。

由于存在多种可能的失败原因,异常非常通用,因为否则将会有20种异常类型,我认为大多数会同意的类型太多。

另外要考虑的例外是:假设有人遇到异常 - 你期望他们做什么?也就是说,您希望以何种有意义的方式以编程方式处理异常。如果异常只针对开发人员,那么真正重要的是异常消息而不是异常的类型。如果以编程方式处理异常,那么您将如何区别地处理这20个案例?或者他们甚至会不同?

答案 1 :(得分:3)

Type.GetType()不只是处理类。你可以得到结构类型,枚举等。 这意味着如果您尝试加载结构并将其命名为错误,则任何名为ClassNotFoundException的异常都将被错误地命名。

因此通用名称为TypeLoadException。