异常类:何时从中导出,在C#(。Net)中?

时间:2010-04-05 12:39:07

标签: c# .net exception

我正在继续我的考试修订。

我遇到过Base Exception类的用法,我也在考试试卷上看过它。

我的问题是你何时从Base Exception类派生出来?

我的印象是,如果您希望自定义类使用更有意义的信息抛出异常,那么您可以创建一个自定义异常类,其中包含代表您的自定义类的使用方式的确切数据,它被设计用于什么场景?

为什么我的自定义异常类不能从'ApplicationException'或'SecurityException'或基础'Exception'类派生?

我的印象是我应该从基础Exception类派生而不是前两个。

我的第二个问题是,你什么时候会从另外两个派生出来?有没有明确的 关于何时从这三者中的任何一个得出的区别?假设没有其他人我错过了吗?

小更新:

来自超越者的这个问题几乎击中了头部。


*您应该使用哪个类来生成特定于应用程序的异常?

答案:ApplicationException类*

4 个答案:

答案 0 :(得分:4)

这在Design Guidelines文档中进行了讨论。

答案 1 :(得分:3)

在我们最近的项目中,我们使用了基本异常类。我们用它来获得以下功能:

  • 所有异常都需要一个数字,因此定义数字的属性是在基类
  • 中完成的
  • 所有异常消息都需要以相同的方式进行格式化,包括数字,原因和类型。这个get formmated消息是在基类中完成的。

我们的基类异常类派生自ApplicationException。这可能是一个错误,有很多关于继承过多的问题的讨论。但是,我们对此没有任何问题。

考试的一个提示:仔细阅读问题。祝你好运。

答案 2 :(得分:2)

通常,您希望从Exception类派生,该类与您要抛出的异常类型最相似。如果问题是已经传递了一些导致问题的Argument或Parameter,请使用ArgumentException。如果你需要一些自定义,继承自ArgumentException。

根据我的经验,使用基本异常的唯一两个原因是:1)当你需要一些完全不适合当前异常模型的自定义异常时或2)当一个方法理论上可以抛出一些例外时,但你已经抓住了你最容易被抛出的那些。

通常,我根本不会继承异常。简单地设置Message属性就足够了。

答案 3 :(得分:0)

理想情况下,异常应该按层次结构分组,这样如果代码想要以相同的方式处理多个异常,它们都将从公共基类派生。如果基本可抛出类型是接口而不是类,那么这种理想可能已经可以实现。但是,实际上,类的单继承限制严重限制了层次结构的有用性。

异常层次结构只是一个有用的概念的唯一时间是,接口的实现或类的新版本(记录为抛出某些异常)希望允许代码区分更多不同的条件而不是这些例外报告。在这种情况下,让一个方法抛出不是从文档中派生的异常将是一个重大变化,因此必须抛出一个异常,该异常继承自最好描述先前未预料到的条件的文档。这相当丑陋,但异常处理机制并没有真正提供更好的选择。令人遗憾的是,像IEnumerator<T>.MoveNext()之类的东西没有被记录为抛出任何只是意味着“对不起 - 系统没有着火或任何东西,我不知道是否有人改变了集合,但是我既不能前进到下一个项目,也不能如实地说枚举是完整的“,但他们没有。

除了需要抛出与现有代码兼容的异常的情况之外,应用程序或库使用的异常派生自公共库可能会有所帮助。它不应该使用ApplicationException,而应该是类似YourApplicationNameExceptionYourLibraryNameException的东西,而不是其他任何东西都不能衍生出来的东西。像ApplicationException这样的东西很糟糕,因为执行catch ApplicationException的代码不仅会获得它从该类型派生的异常,还会获得任何其他库派生的异常。