我什么时候应该创建一个新的Exception类

VDe*_*Dev 20 java exception

我注意到许多Java异常类仅在类的名称上有所不同,并且不添加任何新功能.例如,大多数例外似乎都会覆盖Exception() or Exception(String message).这违背了继承的原则,即: - 继承以添加功能.

创建新的Exception类有什么好的理由?

Cla*_*diu 24

例外是一种特殊情况.在他们的例子中,继承不是添加新功能,而是添加新的错误类.这可以让您的代码捕获特定类型的错误,同时忽略其他错误.

假设您正在编写一个大型项目.您有一个数据组件,并且您有一个显示组件.它们都可以以各种方式失败,并且您希望为这些失败抛出异常.但是,Display组件并不关心数据组件引起的异常,反之亦然.如果所有类都抛出Exception,那么就无法找出异常的来源.但是,如果Exception使用DataException和子类GraphicsException,即使它们不添加新功能,您现在可以抛出并捕获这些特定类型的异常,即图形组件可以捕获GraphicsException而不必处理数据异常.

  • 不要忘记继承(例如,MyNumericDataException扩展MyDataException)允许您的异常处理体系结构将各种类型的异常组合在一起. (5认同)
  • 是的,但Java类的单一继承非常适合设置抽象层次结构.因此,允许对异常的响应程度,即卷起更高级别抽象的异常. (3认同)
  • 好吧,使用子类来区分异常原因似乎违反了继承的使用.还有其他方法可以识别类型.然而,真正的问题是语言的限制,因为catch/throw具有固有的结构,可以根据类类型进行区分. (2认同)

jba*_*all 11

您可以按类型捕获异常,并且具有与基本异常类相同的特定类型的异常允许您在异常处理中进行精确处理.

我认为它确实通过增加异常处理代码的特异性来直接添加新功能.


har*_*are 5

我建议阅读《Effective Java》第 9 章的全部或大部分内容。特别是第 60 条:“支持使用标准异常”和第 61 条:“抛出适合抽象的异常”。

编辑 1:或第一版中的第 42 和 43 项。