我注意到许多Java异常类仅在类的名称上有所不同,并且不添加任何新功能。例如,大多数例外情况似乎都会覆盖Exception() or Exception(String message)
。这违背了继承的原则,即: - 继承以添加新功能。
创建新的Exception类有什么好的理由?
答案 0 :(得分:24)
例外是一种特殊情况。在他们的例子中,继承不是添加新功能,而是添加新的错误类。这可以让您的代码捕获特定类型的错误,同时忽略其他错误。
假设您正在撰写一个大型项目。您有一个数据组件,并且您有一个显示组件。它们都可以以各种方式失败,并且您希望为这些失败抛出异常。但是,Display组件并不关心数据组件引起的异常,反之亦然。如果所有类只抛出Exception
,则无法确定异常的来源。但是,如果使用Exception
和DataException
将GraphicsException
子类化,即使它们不添加新功能,您现在可以抛出并捕获这些特定类型的异常,即图形组件可以捕获GraphicsException
而不必处理数据异常。
答案 1 :(得分:11)
您可以按类型捕获异常,并且具有与基本异常类相同的特定类型的异常允许您在异常处理中进行精确处理。
我认为它确实通过增加异常处理代码的特异性来直接添加新功能。
答案 2 :(得分:3)
如果要为特定条件提供错误处理,请使用新的异常类型。看一下java.io.IOException,您将看到以下子类:
ChangedCharSetException
CharacterCodingException
CharConversionException
ClosedChannelException
EOFException
FileLockInterruptionException
FileNotFoundException
FilerException
HttpRetryException
IIOException
InterruptedIOException
InvalidPropertiesFormatException
JMXProviderException
JMXServerErrorException
MalformedURLException
ObjectStreamException
ProtocolException
RemoteException
SaslException
SocketException
SSLException
SyncFailedException
UnknownHostException
UnknownServiceException
UnsupportedDataTypeException
UnsupportedEncodingException
UTFDataFormatException
ZipException
假设您要从文件中读取,可能会获得通用IOException,FileNotFoundException和EOFException。您可能希望以不同方式处理每个案例。如果您只有IOException,则必须执行类似查看错误消息的操作,然后执行if / else语句以确定实际错误是什么,以便您可以向用户显示合理的消息。通过异常层次结构,您可以更轻松地处理这些情况。
答案 3 :(得分:2)
在这种情况下,继承添加的功能与catch语句有关,可以按类型区分。通常按类型区分子类被认为是一种不好的做法,但异常处理是一个例外。
它肯定会导致奇怪的情况(例如具有相同逻辑的多个catch语句),就像您按类型区分事物时所预期的那样,但这是语言的限制。
答案 4 :(得分:2)
我建议阅读Effective Java第9章的全部或大部分内容。尤其是第60项:“赞成使用标准例外”和第61项:“抛出适用于抽象的例外”。
编辑1:或第一版中的Items 42 and 43。
答案 5 :(得分:2)
如果您需要或想要将特定错误情况与代码中的其他错误区分开来,那么将相应的异常子类化是有意义的。您应该 NOT 需要查看错误消息以确定出现了什么问题 - 仅限于人眼。
另请注意,正确命名的异常可能足以让维护人员在必须诊断堆栈跟踪时推断出出现了什么问题。典型的例子是ArrayOutOfBoundsException。
答案 6 :(得分:1)
这种重命名可以消除模糊性。发生的错误。 e.g。
Foo getFoo() throws FooNotFoundException
将明确指出无法找到Foo
,而不是(什么?)某些非法状态,或数据库连接错误或类似情况,您可以选择编码(或不编码) 特定错误。如果您选择抛出更通用的异常,则不太清楚(以编程方式)发生了什么。
答案 7 :(得分:1)
仅仅捕获任何异常是一种糟糕的形式,因为您不仅不知道它来自何处,而且可能会阻止您在发生错误时正确处理错误。如果您只是捕获任何类型的异常并以相同的通用方式处理它,您可能会隐藏软件中的其他问题,甚至引入新的问题。因此,从技术上讲,子类化Exception 会添加新功能。
答案 8 :(得分:0)
当您的API用户可能需要有条件地捕获它时(或者checked exceptions在throws
中指定不同的特定类型),您可以添加新的异常类。
答案 9 :(得分:0)
为任何类型创建例外都非常愚蠢。也许您应该为不同的层(DAO,服务等)或不同的操作(创建记录,重复记录等)创建例外。