如果我有引發兩個異常的方法調用,但是一個異常是另一個異常的超類,那麼我應該在方法簽名中拋出這兩個異常還是隻拋出超類異常?我只是想知道它將如何查找作爲一個實例拋出的異常,並將其作爲該實例的超類發佈。如何在API中發佈異常
回答
首先,一個警告:一個API應拋出異常有意義給調用者。 API對內部失敗的事件聲明異常是有害的。在這些情況下,它應該被封裝在一個異常中,將問題傳達給調用者。
這就是說,我沒有任何問題拋出超類和它的子類。調用者只需要捕獲超類異常,但是可以在throws子句文檔中聲明哪些可能發生。
E.g.一個FTP庫的put(File, URL)
方法可能會說可能會發生一個通用的IOException
(以處理套接字連接失敗的情況等),但是也會在throws子句中加入FileNotFoundException
來傳達如果要傳輸的文件不能被傳遞被發現。
擲兩,因爲兩者都可以在不同的catch塊來處理,它也將創造良好的文檔
你應該讓throws子句包含兩個例外。沒有語義上的差異,但它在文檔目的上有所不同。
這就是他們在標準API中的做法。例如,看看FileImageOutputStream
。它拋出既是FileNotFoundException
和IOException
即使前者是後者的一個子類:
public FileImageOutputStream(File f) throws FileNotFoundException,
IOException
這樣的方法明確地記錄了它可能拋出FileNotFoundException
。在客戶代碼中,清楚地表明您不需要打擾EOFException
,CharacterCodingException
,CharConversionException
或任何其他IOException
。
作爲一個經驗法則,我會說,它像檢查或unchecked異常:
- 如果主叫方可以做2個例外的區別的東西,然後扔他們兩個,即使他們是母親/女兒
- 如果主叫不能做差價的話,則拋出只有一
- 如果主叫方不能修復(例如重試,重試的SQL調用由於樂觀鎖連接)做一些事情,然後拋出運行時。
我讀過OP的問題,並不是說這個方法是否應該拋出這兩個相關的異常,而是看是否通過方法簽名來記錄它們,因爲它們都是拋出的。
如果有人被記錄,那麼另一個應該被記錄爲清晰和完整。
這就是說,拋出兩個例外時,其中一個是另一個的基礎引發設計懷疑,讓我想看看代碼來理解爲什麼。像這樣的情況有時會發生,當方法使用異常來指示關於其內部操作的一些細節時,而不是儘可能簡單地指示該方法不能完成它設計的目的。
- 1. API Manager Publisher發佈API時發生異常
- 2. 發佈NSData導致異常
- 3. 捕獲異常只發布
- 4. 如何發佈API
- 5. 如何發佈API?
- 6. Windows API引發異常
- 7. 如何在Delphi中引發異常?
- 8. 如何在VB.NET中引發異常
- 9. 如何在Jinja2宏中引發異常?
- 10. 如何在rails中引發異常
- 11. 如何取消並在Task.WhenAll引發異常時引發異常?
- 12. 如何在異步任務中獲取異常時在主線程上發佈異常
- 13. 如何使用LWP :: UserAgent在BOX API中發佈發佈請求?
- 14. 如何在異常中捕獲異常?
- 15. 如何在應用程序發佈時查找異常錯誤?
- 16. 如何管理API中的異常?
- 17. 如何從已發佈的Web API獲取詳細信息異常
- 18. 如何在使用java開發RESTful API時控制異常?
- 19. 如何發佈到XML API?
- 20. 如何處理異常中引發的異常?
- 21. 在PHP中引發異常?
- 22. 在Rcpp中引發異常
- 23. 在greenlets中引發異常
- 24. 如何從Java中引發Jython異常?
- 25. 在Azure中發佈Web API
- 26. 如何在發生異常時檢索發佈到web api結束點的對象?
- 27. 如何在Facebook API上發佈帖子?
- 28. 如何在API Store上發佈服務?
- 29. 如何在WSO2上發佈WSO2 API?
- 30. 如何在通過lambda表達式引發異常時全局處理asp.net web api中的異常
無論如何,他們可以在一個catch塊中被區別對待;扔一個並不妨礙這一點。 – 2010-12-07 16:08:18
@Mark Peters,如果你聲明你的方法拋出A和B,那麼你的客戶端會知道我可以以不同的方式處理這兩個異常。 – 2010-12-07 16:12:45