【问题标题】:Why is there no System.ClassNotFoundException in .Net?为什么 .Net 中没有 System.ClassNotFoundException?
【发布时间】:2011-01-04 22:43:41
【问题描述】:

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

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

找不到重载,引发的异常是TypeLoadException。

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

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

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

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

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

【问题讨论】:

  • 您为什么将问题从 TypeNotFoundException 更改为 ClassNotFoundException? TypeNotFoundException 更符合框架。
  • Alastair 回答了这个问题;我只是补充一点,创建自定义异常类并不是很多工作,只需使用exception sn-p,它会使用所有常用构造函数为您填充整个类定义。
  • 山姆——因为我是个白痴。它真的应该是 TypeNFE 而不是 ClassNFE。 (我可以再改回来......)但是,将使用我正在构建的工具(在交互式解释上下文中)的开发人员几乎总是试图找到一个类。
  • Aaronaught -- 我不知道异常 sn-p;谢谢你的提示。

标签: .net exception reflection


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我没有考虑到无法将类型名称绑定到实际类型的所有这些不同的可能原因。拥有许多不同的异常类型并不是特别有益。如果 TypeLoadException 包含有关此特定故障原因的详细信息,则使用一种 Exception 类型来处理它们是有意义的。
【解决方案2】:

Type.GetType() 不仅仅处理类。您可以获取结构、枚举等的类型。 这意味着,如果您尝试加载结构,任何名为 ClassNotFoundException 的异常都将被错误地命名,并且命名不正确。

因此是通用名称,TypeLoadException。

【讨论】:

  • 哦,如果 .ctor 抛出异常,或者安全需求失败(以及其他事情),你也会得到 TypeLoadException
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多