簡單的方法來在任何編程開始一場宗教戰爭論壇是:「處理錯誤的最佳方式是什麼?」 :)但這是一個完全有效的問題。
在Java中,正如您可能已經知道的,有兩種異常:運行時可檢測和編譯時可檢測。 (另一組標籤在運行時爲「未選中」,在編譯時爲「已檢查」。)編譯時檢測到的異常拋出了專門爲它們定義的異常,這是您對自定義數據庫異常的處理方式。檢查異常和未檢查異常(例如:空指針或索引超出範圍異常)之間的巨大差異在於,如果檢查異常,則需要使用進行處理,或者使用「throws」關鍵字從方法範圍中委託處理,強制調用方法來處理它。可以處理未經檢查的(通過try/catch塊),但不是必需的。未經檢查的異常還只會拋出特定的異常,這些異常來自類RuntimeException,後者本身是Exception的後代。(請參閱http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html瞭解完整的自下而上)。雖然您可以使用try/catch塊來捕獲運行時異常,但您不能將這些類型的異常轉換爲除特定運行時異常之外的任何其他異常處理(例如,運行時的空指針引用只能由NullPointerException對象處理或其超類對象之一,而沒有其他)。
那麼爲什麼「例外評論課程」呢?因爲是否應該向調用方法「向上」拋出異常或者在其發生的方法中當場處理異常,這在很大程度上與處理異常生成代碼之後的代碼是否可以「生存」的問題有關成功完成try/catch塊中的任何內容。本質上,後續代碼是否可能存在未經檢查(運行時)異常,如空指針異常?通常情況就是這樣。或者,隨後的代碼可能是可執行的,但處於不可靠的狀態(例如,字段值未根據期望設置等)。或者,如果try/catch塊在數據庫調用周圍執行更新時,數據庫數據狀態可能不正確,無法完成您想要的操作。你需要決定基於上下文和目標(依賴)是否:
- 向上拋出異常不處理或報告在本地,在本質上把負擔調用方法來對付它。
- 在本地處理異常並記錄/報告(可能),然後使用catch(){}塊中的'return'退出該方法。
- 在本地處理異常並記錄/報告(可能),然後繼續在該方法中執行代碼。
正如我所說,您所做的取決於您需要做什麼。就我個人而言,我將異常處理視爲每個給定方法的問題,並在本地處理。拋出的異常實際上意味着該方法未能完成其預期的任務 - 除非調用方法可以彌補其失敗,或者在創建異常的方法中,後續代碼仍然可以實現期望的目標。把它扔到調用方法只是意味着你從桌子上拿走了這兩個選項中的一個,更糟糕的是,它發生時立即拋出,所以在退出使用方法之前,你拿掉了在異常之後拾取的任何選項'返回'或繼續使用該方法。現在有時可能需要使用try/catch來測試代碼中的條件;即使用某種方法的異常拋出特性作爲確定你的代碼將在下一步做什麼的手段。但是,這通常是皺眉,尤其是。如果有「更清潔」的方式。 [沒有像Java純粹主義者那樣的純粹主義者。 :)]
當然,向上拋出異常很可能有時間。但是,國際海事組織正是在這種情況下,調用方法不必太在意被調用方法邏輯影響的任何對象或數據的狀態。我把它看作是處理所產生的不那麼重要的例外的一種更爲概括的方式。在我自己的情況下,我更願意在使用可能爲null的對象之前檢查空對象引用。由於方法中的異常而將可返回對象賦值爲null,並在catch(){}塊中返回它,這是一種非常常用的方法,用於讓調用方法知道被調用的方法未能按照其意圖執行。例如:
public meth1() {
Object o = meth2();
if (o != null) {
... do what you need to ...
} else
{
... deal w/ no valid o object ...
}
...
}
private Object meth2() {
Object retnme = new Object();
...
try {
... give it yer best ...
} catch (Exception e)
{
logException(e); // a call to some logging method.
... clean up bad karma ...
return null;
}
...
return retnme;
}
所有這一切說,重新您的ABT你的代碼直接的問題:基於上述,並銘記我不完全知道你的情況,我不明白爲什麼你應該拋出定製你爲調用方法創建的異常,除非你特別想用這個異常來表示不管什麼原因發信號給調用方法,你要創建的db已經存在。如果知道這對調用方法沒有特別的用處 - 不需要這樣做。這個決定的一部分取決於你是否期望使用任何實現你的接口的類來知道數據庫是否存在。避免使用這種策略的一種方法是編輯接口和類文件,以便該方法返回布爾值而不是void。如果它返回'真',數據庫已創建。如果'虛假',那不是出於某種原因。你也可以讓它返回一個int值,並根據它的值指示數據庫創建是否成功。例如,值0可能意味着成功,而值1..n可能表示失敗的原因,當然一個值表示db已經存在的事實。
真的,天空的極限。 :)希望這有一些幫助。
沒有。我寫它只是爲了顯示我一直在處理 – oiyio
我添加了可拋類並理解你的意思。更重要的是我明確地搜索數據庫是否已經存在或沒有。我用http://stackoverflow.com/questions/12414596/how-to-check-if-a-particular-database-in-mysql-already-exists-using-java中的問題代碼 – oiyio