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

J.M*_*ill 3 .net reflection exception

当尝试在运行时定位类型(通常是类)时,如果名称传递给

  Type.GetType(string typeName, bool throwOnError = True)
Run Code Online (Sandbox Code Playgroud)

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

我理解这背后的想法是 CLR 认为问题在于我们(尚未)加载包含所寻求类型的(或任何)程序集,但我的想法是问题在于CLR 找不到指定名称的类。(当然,这个名字可能拼写错误。)

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

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

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

同时,我会再问一遍——为什么 ClassNotFoundException 还没有定义?

Eil*_*lon 5

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

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

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

由于失败的可能原因有很多,所以异常是非常通用的,否则就会有 20 种异常类型,我认为大多数人都认为数量太多了。

关于异常要考虑的另一件事是:假设有人遇到异常 - 您希望他们做什么?也就是说,您希望以何种有意义的方式以编程方式处理异常。如果异常仅适用于开发人员,那么真正重要的是异常消息而不是异常类型。如果以编程方式处理异常,那么您将如何以不同的方式处理这 20 种情况?或者说它们会有所不同吗?