1. 程式人生 > 其它 >java try catch 與 throws 使用場景以及怎麼合理使用?

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