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