JAVA異常處理原則和log4j輸出詳細異常分析

y_keven發表於2014-01-17

1.多用try,catch;不要一個try,catch包含所有內容

   好處:不同模組抓取不同異常,某一模組異常掛了,不影響其他模組的程式的進行

 

2.多寫幾個catche;儘量不要使用Exception這個大異常去包容所有異常

   不要為了追求程式碼的簡練,try,catch只寫一個,使用Exception去抓取所有可能的異常,這只是理想狀態,程式出錯不是直接列印出來異常就完事了,應該在catche抓取異常的同時一方面給程式設計師輸出錯誤日誌,一方面做些處理反饋給使用者,比如一些提示錯誤框或者錯誤頁面,不能讓使用者不知道所以然但是系統沒有正常進行。

   綜上所述,應該多使用幾個catche塊去抓取不同異常,然後做不同處理,返回給使用者,儘量不同異常使用不同cacht塊抓取別一個Exception抓取所有異常;

 

3.通過測試來談談java常見異常列印的區別

packagecom.hudong.test;

importorg.apache.commons.logging.Log;

importorg.apache.commons.logging.LogFactory;

 

public class TryCatchTest{

 

    private final static Log logger =LogFactory.getLog(TryCatchTest.class);

    public static void main(String[] args) {

        try {

            System.out.println(1 / 0);

        } catch (Exception e) {

            logger.error("---fill---:" +e.fillInStackTrace());

            logger.error("----------美麗的分割線---------");

            logger.error("---msg---:"+ e.getMessage());

            logger.error("----------美麗的分割線---------");

            logger.error("---e---:" +e.toString());

logger.error("---e===e---:"+ e);

            System.out.println("===============");

            System.out.println(e.toString());

           System.out.println("--------------------");

            System.out.println(e.getMessage());

           System.out.println("--------------------");

            e.printStackTrace();

            System.out.println("--------------------");

           System.out.println("---fill---:"+e.fillInStackTrace());

            System.out.println("===============");

        }

try {

           System.out.println(1 / 0);

       } catch (Exception e) {

           try {

                throw e;

                // throw e.fillInStackTrace();

           } catch (Throwable e1) {

                e1.printStackTrace();

           }

       }

    }

}

關於java異常的列印網上有很多資料,關於log4j日誌的異常輸出也有很多資料;但是今天突然想到一個問題:幾種異常列印的區別,以及哪種可以列印出詳細的異常軌跡 和指定錯誤行;網上卻沒找到確切的說法和資料;所以自己寫了個測試小程式,通過查資料確認得出以下結論:

1.上面案例的測試只有兩種情況可以列印出詳細錯誤堆疊資訊:

logger.error("---e===e---:"+ e);

throw e;

第一種是log4j定義的error(message,e)方法實現的列印詳細資訊;第二種是java自帶的丟擲詳細異常的方式;經過測試只有這兩種可以列印出詳細的堆疊軌印,其他方式都只輸出錯誤資訊。

2. throw e與throwe.fillInStackTrace()的區別

    前者輸出了詳細的錯誤程式碼行;後者只輸出丟擲異常的位置,並未列印出錯誤程式碼行的位置,即e.fillInStackTrace()所在地額程式碼行;所以相對來說,如果想要清楚的丟擲錯誤資訊應該使用前者。

3.logger.error("---e===e---:" + e)與logger.error("---fill---:" +e.fillInStackTrace())的區別;

   throw、throwe.fillInStackTrace()兩個都可以列印出詳細異常,與不同的是,log4j前者方式列印的出詳細異常並指向錯誤程式碼行,而後者不會列印詳細堆疊。

4.fillInStackTrace輸出資訊檢視

如果呼叫e.fillInStackTrace() ,表示重新填充stack裡面的資訊,那就會丟失低s一級環境的違例物件的資訊。如果重新new 一個違例也丟失低一級的違例物件的資訊。

 

相關文章