我正在继续我的考试修订。
我遇到过Base Exception类的用法,我也在考试试卷上看过它。
我的问题是你何时从Base Exception类派生出来?
我的印象是,如果您希望自定义类使用更有意义的信息抛出异常,那么您可以创建一个自定义异常类,其中包含代表您的自定义类的使用方式的确切数据,它被设计用于什么场景?
为什么我的自定义异常类不能从'ApplicationException'或'SecurityException'或基础'Exception'类派生?
我的印象是我应该从基础Exception类派生而不是前两个。
我的第二个问题是,你什么时候会从另外两个派生出来?有没有明确的 关于何时从这三者中的任何一个得出的区别?假设没有其他人我错过了吗?
小更新:
来自超越者的这个问题几乎击中了头部。
*您应该使用哪个类来生成特定于应用程序的异常?
答案:ApplicationException类*
答案 0 :(得分:4)
这在Design Guidelines文档中进行了讨论。
答案 1 :(得分:3)
在我们最近的项目中,我们使用了基本异常类。我们用它来获得以下功能:
我们的基类异常类派生自ApplicationException。这可能是一个错误,有很多关于继承过多的问题的讨论。但是,我们对此没有任何问题。
考试的一个提示:仔细阅读问题。祝你好运。
答案 2 :(得分:2)
通常,您希望从Exception类派生,该类与您要抛出的异常类型最相似。如果问题是已经传递了一些导致问题的Argument或Parameter,请使用ArgumentException。如果你需要一些自定义,继承自ArgumentException。
根据我的经验,使用基本异常的唯一两个原因是:1)当你需要一些完全不适合当前异常模型的自定义异常时或2)当一个方法理论上可以抛出一些例外时,但你已经抓住了你最容易被抛出的那些。
通常,我根本不会继承异常。简单地设置Message属性就足够了。
答案 3 :(得分:0)
理想情况下,异常应该按层次结构分组,这样如果代码想要以相同的方式处理多个异常,它们都将从公共基类派生。如果基本可抛出类型是接口而不是类,那么这种理想可能已经可以实现。但是,实际上,类的单继承限制严重限制了层次结构的有用性。
异常层次结构只是一个有用的概念的唯一时间是,接口的实现或类的新版本(记录为抛出某些异常)希望允许代码区分更多不同的条件而不是这些例外报告。在这种情况下,让一个方法抛出不是从文档中派生的异常将是一个重大变化,因此必须抛出一个异常,该异常继承自最好描述先前未预料到的条件的文档。这相当丑陋,但异常处理机制并没有真正提供更好的选择。令人遗憾的是,像IEnumerator<T>.MoveNext()
之类的东西没有被记录为抛出任何只是意味着“对不起 - 系统没有着火或任何东西,我不知道是否有人改变了集合,但是我既不能前进到下一个项目,也不能如实地说枚举是完整的“,但他们没有。
除了需要抛出与现有代码兼容的异常的情况之外,应用程序或库使用的异常派生自公共库可能会有所帮助。它不应该使用ApplicationException
,而应该是类似YourApplicationNameException
或YourLibraryNameException
的东西,而不是其他任何东西都不能衍生出来的东西。像ApplicationException
这样的东西很糟糕,因为执行catch ApplicationException
的代码不仅会获得它从该类型派生的异常,还会获得任何其他库派生的异常。