JAVA異常處理原則和log4j輸出詳細異常分析
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 一個違例也丟失低一級的違例物件的資訊。
相關文章
- Java 異常表與異常處理原理Java
- JAVA 異常處理Java
- Java 異常處理Java
- JAVA異常處理Java
- Java異常使用原則Java
- 異常篇——異常處理
- Java 異常處理:使用和思考Java
- JAVA_異常處理Java
- Java異常詳細介紹Java
- 異常-throws的方式處理異常
- Java 異常處理中的種種細節!Java
- 異常處理
- springboot下新增全域性異常處理和自定義異常處理Spring Boot
- Java異常處理(非常全面)Java
- Java異常處理機制Java
- 重學Java - 異常處理Java
- java異常處理筆記Java筆記
- C++ 異常處理機制詳解:輕鬆掌握異常處理技巧C++
- restframework 異常處理及自定義異常RESTFramework
- 詳解C#異常處理C#
- Reactor詳解之:異常處理React
- 約束和異常處理
- 迭代器和異常處理
- Java 的異常處理機制Java
- Java之異常處理try{}catch(){}Java
- Java進階02 異常處理Java
- JAVA學習之異常處理Java
- java異常的處理機制Java
- React 異常處理React
- JS異常處理JS
- oracle異常處理Oracle
- Python——異常處理Python
- Python異常處理Python
- ThinkPHP 異常處理PHP
- JavaScript 異常處理JavaScript
- 異常的處理
- golang - 異常處理Golang
- 異常處理2
- 異常處理1