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
       

       


       
       
       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM