java try catch 與 throws 使用場景以及怎麼合理使用?
對於如下場景,給出不同的看法:
自定義的方法裡面java api丟擲了異常,這個時候,我是需要捕獲呢?還是我也繼續往上拋。
比如,我這裡定義了一個日期處理的方法,有兩種對異常的處理方式,
1、使用throws
繼續向上丟擲異常:
public static Date convertStringToDate(String dateString, String format) throws ParseException{ if (org.springframework.util.StringUtils.isEmpty(format)) { format = "yyyy-MM-dd HH:mm:ss"; } SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.parse(dateString); }
2、自己捕獲異常
public static Date convertStringToDate(String dateString, String format) { if (org.springframework.util.StringUtils.isEmpty(format)) { format = "yyyy-MM-dd HH:mm:ss"; } SimpleDateFormat sdf = new SimpleDateFormat(format); try { return sdf.parse(dateString); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } }
請問,哪種方式,更好一些呢?
看法一:
我傾向於向上丟擲異常,因為你這個方法裡面的引數是呼叫者提供的,如果傳入的日期有問題,應該讓呼叫者知道,並且捕獲進行進一步的處理。比如,如果這個日期是使用者設定的,就要通知使用者重新設定,如果這個日期是其他輸入源提供,就要有一個替代的日期作為標識,表明這個原本輸入的日期是錯的。
看法二:
對於你這兩種方法我有個人看法。
1、繼續向上丟擲異常
2、自己捕獲異常
如果你的第一種方法裡。傳入開始日期和結束日期。分別操作這兩個引數都有可能出現異常。像你這第一種方法丟擲,那呼叫者怎麼區分是哪一個日期出了問題呢?你有沒有自己想過自己捕獲異常之後再拋給呼叫者呢?
就像你一個方法裡,
操作開始日期報錯了。catch到Exception裡給一個retMsg做區分是開始日期不正確
操作結束日期報錯了。catch到Exception裡給一個retMsg做區分是結束日期不正確
再將這個具體的Exception拋給呼叫者。反饋給使用者豈不是更加明確了。
看法三:
try catch
一般在最上層使用,底層的都使用 throws 向上丟擲。如果即在最上層做try catch
,又在底層方法做try catch
,程式會變的很混亂。一般可預見的錯誤,比如空指標,你完全可以在最上層比如 controller 層進行判斷下,不要讓null進入底層方法引起不必要的麻煩,你也省的給底層和上層方法都加預防空指標異常的判斷。
看法四:
首先要理解異常到底是個什麼
異常其實是程式執行過程中無法預料的事件(這裡指非RuntimeException),一旦出現這些事件,你必須要進行處理。比如正在訪問 資料庫時,
資料庫伺服器當機,導致你的業務被中斷。這種情況下,你的系統至少必須要告訴明確地使用者這次業務操作是失敗的,而在後臺中,應該留下錯誤日誌,以便排除故
障時留下線索。如何處理異常,這和你的系統設計方案有關
以三層架構(表現層、業務邏輯層、資料訪問層)和前面說的資料庫訪問失敗為例,在你的資料訪問層提供了方法:
getXXX();
getYYY();updateXXX(XXX data);
updateYYY(YYY data);
……對異常的處理你可以
1、在你的資料訪問層捕捉異常,如果是 getXXX 方法出現異常,返回null,如果是updateXXX 方法出現異常,返回false,在資料訪問層記錄事務日誌,邏輯層根據資料訪問層的返回值進行邏輯處理
2、在資料訪問層宣告丟擲異常,由邏輯層進行統一捕捉,並記錄錯誤日誌。同樣通過返回值,讓表現層來決定提供哪些資訊給使用者
3、其它方式我不常用,當然系統設計也不會只有三層設計一種方式,就不說了
異常處理是一種策略,一旦確定,則應該進行統一規範,不能讓各個程式設計師過於自由發揮
其他看法:
向上拋,快到前臺的時候把控下。
如果知道可能會出錯的異常型別,就try catch,並做出相應的處理。。
如果無法預測。。直接throws..異常處理最忌諱的就是catch後不處理,直接列印一句e.printStackTrace() 這樣如果有問題就會隱藏掉,內部的方法呼叫的時候可以往上拋異常
例如,dao層一個拋給service層,service層再拋給Controller層,Controller層就不要再拋了
來自於http://bbs.csdn.net/topics/391990528