對於如下場景,給出不同的看法:
其實我更多的疑問在於,自定義的方法里面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
