2010-12-07 28 views
2

如果我有引發兩個異常的方法調用,但是一個異常是另一個異常的超類,那麼我應該在方法簽名中拋出這兩個異常還是隻拋出超類異常?我只是想知道它將如何查找作爲一個實例拋出的異常,並將其作爲該實例的超類發佈。如何在API中發佈異常

回答

3

首先,一個警告:一個API應拋出異常有意義給調用者。 API對內部失敗的事件聲明異常是有害的。在這些情況下,它應該被封裝在一個異常中,將問題傳達給調用者。

這就是說,我沒有任何問題拋出超類和它的子類。調用者只需要捕獲超類異常,但是可以在throws子句文檔中聲明哪些可能發生。

E.g.一個FTP庫的put(File, URL)方法可能會說可能會發生一個通用的IOException(以處理套接字連接失敗的情況等),但是也會在throws子句中加入FileNotFoundException來傳達如果要傳輸的文件不能被傳遞被發現。

2

擲兩,因爲兩者都可以在不同的catch塊來處理,它也將創造良好的文檔

+2

無論如何,他們可以在一個catch塊中被區別對待;扔一個並不妨礙這一點。 – 2010-12-07 16:08:18

+0

@Mark Peters,如果你聲明你的方法拋出A和B,那麼你的客戶端會知道我可以以不同的方式處理這兩個異常。 – 2010-12-07 16:12:45

3

你應該讓throws子句包含兩個例外。沒有語義上的差異,但它在文檔目的上有所不同。

這就是他們在標準API中的做法。例如,看看FileImageOutputStream。它拋出既是FileNotFoundExceptionIOException即使前者是後者的一個子類:

public FileImageOutputStream(File f) throws FileNotFoundException, 
              IOException 

這樣的方法明確地記錄了它可能拋出FileNotFoundException。在客戶代碼中,清楚地表明您不需要打擾EOFExceptionCharacterCodingExceptionCharConversionException或任何其他IOException

1

作爲一個經驗法則,我會說,它像檢查或unchecked異常:

  • 如果主叫方可以做2個例外的區別的東西,然後扔他們兩個,即使他們是母親/女兒
  • 如果主叫不能做差價的話,則拋出只有一
  • 如果主叫方不能修復(例如重試,重試的SQL調用由於樂觀鎖連接)做一些事情,然後拋出運行時。
1

我讀過OP的問題,並不是說這個方法是否應該拋出這兩個相關的異常,而是看是否通過方法簽名來記錄它們,因爲它們都是拋出的。

如果有人被記錄,那麼另一個應該被記錄爲清晰和完整。

這就是說,拋出兩個例外時,其中一個是另一個的基礎引發設計懷疑,讓我想看看代碼來理解爲什麼。像這樣的情況有時會發生,當方法使用異常來指示關於其內部操作的一些細節時,而不是儘可能簡單地指示該方法不能完成它設計的目的。