如果我有一个抛出两个异常的方法调用,但是一个异常是另一个的超类,我应该在方法签名中抛出两个异常,还是只抛出超类异常?我只是想知道如何将异常作为一个实例抛出但作为该实例的超类发布。
答案 0 :(得分:3)
首先,警告:API应该抛出对调用者有意义的异常。 API从内部失败的事物中声明异常是有害的。在这些情况下,它应该包含在将问题传达给调用者的异常中。
那就是说,抛出超类及其子类我没有任何问题。调用者只需要捕获超类异常,但是在throws子句中声明两者都可能发生这种情况。
E.g。 FTP库的put(File, URL)
方法可能会说一般IOException
可能发生(处理套接字连接失败的情况等),但也会在throws子句中放置FileNotFoundException
来传达如果找不到要传输的文件,它将被抛出。
答案 1 :(得分:3)
您应该让throws子句包含两个异常。没有语义差异,但它在文档目的上有所不同。
这是他们在标准API中执行此操作的方式。例如,请查看FileImageOutputStream
。它会抛出FileNotFoundException
和IOException
,即使前者是后者的子类:
public FileImageOutputStream(File f) throws FileNotFoundException,
IOException
这种方法明确表明它可能会抛出FileNotFoundException
。在客户端代码中,很明显您不必担心EOFException
,CharacterCodingException
,CharConversionException
或任何其他IOException
。
答案 2 :(得分:2)
同时抛出,因为在catch块中两者都可以区别对待,也会创建良好的文档
答案 3 :(得分:1)
根据经验,我会说这就像检查或未检查的例外:
答案 4 :(得分:1)
我读OP的问题并不是因为该方法是否应该抛出这两个相关的异常,而是因为是否通过方法签名来记录它们,因为它们都被抛出。
如果记录了一个,那么另一个应该记录在案,以保持清晰和完整。
也就是说,抛出两个异常,当其中一个是另一个的基础时,会引起设计怀疑,这使我想要看到代码来理解原因。当方法使用异常来指示有关其内部操作的一些细节而不是尽可能简单地指示该方法无法按其设计的方式执行时,有时会出现这种情况。