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

1.多用try,catch;不要一個try,catch包含全部內容java

好處:不一樣模塊抓取不一樣異常,某一模塊異常掛了,不影響其餘模塊的程序的進行程序員

2.多寫幾個catche;儘可能不要使用Exception這個大異常去包容全部異常apache

不要爲了追求代碼的簡練,try,catch只寫一個,使用Exception去抓取全部可能的異常,這只是理想狀態,程序出錯不是直接打印出來異常就完事了,應該在catche抓取異常的同時一方面給程序員輸出錯誤日誌,一方面作些處理反饋給用戶,好比一些提示錯誤框或者錯誤頁面,不能讓用戶不知道因此然可是系統沒有正常進行。小程序

綜上所述,應該多使用幾個catche塊去抓取不一樣異常,而後作不一樣處理,返回給用戶,儘可能不一樣異常使用不一樣cacht塊抓取別一個Exception抓取全部異常;測試

3.經過測試來談談java常見異常打印的區別日誌

packagecom.hudong.test;對象

importorg.apache.commons.logging.Log;get

importorg.apache.commons.logging.LogFactory;io

public class TryCatchTest{class

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 一個違例也丟失低一級的違例對象的信息。

相關文章
相關標籤/搜索