2011-04-05 15 views
3

我正在爲REST風格的Web服務API編寫Java包裝器。如何在編寫庫(而不是應用程序)時處理異常 - Java

我現在正在嘗試清理一些異常處理,並不確定採取什麼方法。這是一個打算供Java程序員使用的工具,所以我不能像處理最終用戶應用程序一樣處理它。

如果我有一個包含可能會拋出異常的代碼的方法(連接),那麼我如何才能讓這些異常浮動到最終的程序員呢?這是我應該如何處理它的方式,這取決於他們是否抓住了例外? etc ...

回答

4

我建議你從底層API中捕獲異常(除非它們真的有意義通過),並且拋出一個更適合你的抽象級別的新異常。

如果您不想拋棄異常原因,請使用exception chaining

+4

S /感覺就像丟棄異常的原因/想誰已經有一個很難庫的用戶調試錯誤/ g的 – ninjalj 2011-04-05 19:49:10

+0

哈哈,好點私刑! +1 – aioobe 2011-04-05 19:51:19

0

問題是你希望你的圖書館是多麼不透明。

您向用戶拋出的每種異常類型都應該暗示用戶可以對此做些事情。例如,

catch (ConnectionException e) { 
    disconnect(); 
    connectAgain(); 
} 

僅當用戶有權訪問斷開連接()和connectAgain()時纔有效。但是,如果您承諾提供各種連接,則您的代碼應該已經具有此邏輯,並且如果失敗,請拋出通用的WrapperException並完成它。

可能對你來說一個好方法是聲明你自己的異常類型(並且不要使它成爲RuntimeException),捕獲你觀察到的異常並拋出異常。

2

我認爲您應該決定現有類型是特定於實現還是圖書館固有的類型。例如,如果它是一個與網絡相關的異常,並且顯然正在製作一個基於網絡的API,我只是讓它傳播開來。無論如何,調用者都需要注意那種錯誤。另一方面,如果它是一個數據庫相關的異常,這是唯一可能的,因爲一些奇怪的原因,你在查找嵌入式數據庫中的WSDL或類似的東西,這顯然不適合調用者必須處理 - 所以抓住它並將其包裝在一個更適合您的抽象層次的例外中。

2

由於是圖書館,您必須將例外傳遞給用戶。

  • 如果您沒有記錄並且不打算創建自定義異常,那麼您就不必處理異常。
  • 如果您正在記錄,處理異常並重新拋出異常。
  • 如果您有自定義異常,請確保它具有例外構造函數參數,然後將當前異常鏈接到當前異常,然後拋出自定義異常。這是維護有用的堆棧跟蹤信息所必需的。
0

我認爲它的重要性在於API的功能,以及它在哪個上下文中的使用。

如果API是演示文稿/渲染層的一部分,那麼我寧願總是返回可以渲染,修飾或寫入響應流的東西。

如果API是爲了執行(非呈現/ UI相關)處理,我將沒有任何問題拋出任何異常超出了API邏輯的範圍。

如果API設計得很好,這些可能會明顯超出API的控制範圍,或者超出了API「知道如何」或「應該」處理範圍的原因,即使它可以捕獲/控制它。

向「用戶」返回異常時,我希望儘可能返回標準異常,而不是單個自定義包裝類型。

但是,在我的API實現中,如果它們提供明確且有用的用途,我會頻繁使用自定義異常類型。

只是我的2美分:)