有關於異常捕獲點滴,plus我也揭揭java的短

来源:https://www.cnblogs.com/buguge/archive/2017/12/28/8137578.html
-Advertisement-
Play Games

揭短ExceptionUtils:有些異常並沒有root cause的,此時,調用ExceptionUtils的getRootCause(final Throwable throwable)返回值是null,而你調用其getRootCauseMessage(final Throwable th)時,... ...


 

先如下代碼:

1     @Test
2     public void testException1() {
3         System.out.println("begin...");
4         int[] arr = new int[]{1};
5         System.out.println(arr[1]);
6     }

 

執行結果:

java.lang.ArrayIndexOutOfBoundsException: 1

	at com.emax.paycenter.web.controller.PayCenterAgentPayAPITest.testException1(PayCenterAgentPayAPITest.java:5)

 

異常是從第5行拋出來的,控制台里顯示的異常堆棧信息也是始於第5行。

 

我們在寫程式時往往要捕獲異常。如下是畫蛇添足型:

 1     @Test
 2     public void testException() {
 3         try {
 4             System.out.println("begin...");
 5             int[] arr = new int[]{1};
 6             System.out.println(arr[1]);
 7         } catch (Exception ex) {
 8             throw ex;
 9         }
10     }

 

很明顯,捕獲了異常,卻只是throw出去,沒任何意義!

 

如下處理方式也不可取:

 1     @Test
 2     public void testException() {
 3         try {
 4             System.out.println("begin...");
 5             int[] arr = new int[]{1};
 6             System.out.println(arr[1]);
 7         } catch (Exception ex) {
 8             throw new MyException( ex.getMessage() );
 9         }
10     }

 

異常的堆棧始於拋出異常的代碼行。catch里經過這樣中轉後,導致堆棧信息的顯示的行號不再是6,而是8。尤其當代碼邏輯複雜時,這樣做無意增加了排障的難度。

當然,我們有時要在系統里通過自定義異常類型,實現我們所需的邏輯控制(自定義異常是個好東西哦)。如果真要通過MyExecption中轉出去,可在throw之前將完整的異常信息記錄到日誌文件里。

 

類似如下代碼是不是很熟悉?

 1     public int myBiz() {
 2         int result;
 3         try {
 4             System.out.println("begin...");
 5             int[] arr = new int[]{1};
 6             result = arr[1];
 7             return result;
 8         } catch (Exception e) {
 9             return 0;
10         }
11     }

 

私自吞異常是要犯法的哦~~

哈哈,去翻翻自己寫的代碼吧~

 

ExceptionUtils記錄異常

.net程式員都知道,記錄一個異常信息時,直接ex.ToString()就可以了。

如果在java里,你還這樣,那就out了。查看一下Exception的基類——Throwable的toString()方法,可知,ex.ToString()返回的是異常類型和message。

這時,要列印完整的日誌信息,apache commons-lang3包里的ExceptionUtils可要派上用場了。 沒錯,用ExceptionUtils.getStackTrace(final Throwable throwable)

 

揭短ExceptionUtils

有些異常並沒有root cause的,此時,調用ExceptionUtils的getRootCause(final Throwable throwable)返回值是null,而你調用其getRootCauseMessage(final Throwable th)時,反而有返回值。 查看getRootCauseMessage的代碼實現,發現它做了二元判斷,如果root cause是null,它就去取th本身的message。 前者返回null,後者有返回值,自我趕腳有些費解!whataboutu?

 

//public class ExceptionUtils {

    public static Throwable getRootCause(final Throwable throwable) {
        final List<Throwable> list = getThrowableList(throwable);
        return list.size() < 2 ? null : (Throwable)list.get(list.size() - 1);
    }

    public static String getRootCauseMessage(final Throwable th) {
        Throwable root = ExceptionUtils.getRootCause(th);
        root = root == null ? th : root;
        return getMessage(root);
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Struts的簡單搭建(入門) 過程摘要:(struts2下載:https://struts.apache.org/) (軟體要求:安裝好eclipse/myeclipse和tomcat) 具體流程: 創建一個新的project,選擇動態web工程: (註意:若此時出現.jsp頁面找不到java b ...
  • 本文算是副產品,正品是利用FFmpeg從任意視頻中生成GIF片段的小程式,寫完了就發。 因為要對視頻畫面進行框選,再生成GIF,所以得有個框選的控制項,可Delphi里沒有啊,只好自己寫一個了。 聲明 本文參考的是盒子網的 "RectTracker" ,原作者署名xwwaw,發佈於2007年5月28日 ...
  • 演示不使用事務出現異常情況 Dao層兩個方法lessMoney()和moreMoney() Service層調用兩個方法 但是兩個操作減與加之間,如果出現異常,則會導致轉賬錢已經轉了,但對方卻沒有到賬的bug,可能伺服器突然故障等引起 解決添加事務,出現異常進行回滾操作 下麵使用配置文件的方法進行事 ...
  • solr 除了能查詢文檔中的數據外, 還可以導入資料庫中的數據. 也就是說, solr 能查詢其他資料庫中的數據(solr本身也是一個資料庫, 非關係型的). 那接下來就試一下導入mysql資料庫中的數據. 一. 準備工作 1. 在solr_core下麵新建lib文件夾. 然後將以下jar包拷貝進去 ...
  • 今天主題是實現併發伺服器,實現方法有多種版本,先從簡單的單進程代碼實現到多進程,多線程的實現,最終引入一些高級模塊來實現併發TCP伺服器。 說到TCP,想起吐槽大會有個段子提到三次握手,也只有程式猿(媛)能get。 UDP伺服器數據傳輸不可靠,這裡就忽略了。 >>: 簡單的單進程TCP伺服器 假代碼 ...
  • import osprint(os.getcwd()) # 獲取當前目錄 F:\python_code\fullstack_s2\week4\day18os.chdir(r'C:/Users')print(os.getcwd()) #改變當前工作目錄 C:\Users print(os.curdir ...
  • 編程語言大致分為機器語言、彙編語言和高級語言,下麵一一介紹這三種語言: 機器語言 由於電腦內部只能接收二進位代碼,因此用二進位0和1編寫的代碼成為機器指令,全部機器指令的集合則構成了電腦的機器語言,用機器語言編寫的程式成為目標程式。只有目標程式才能直接被電腦識別和執行。但機器語言唯一的缺點就是 ...
  • 首先來看看 JAVA 熱部署與熱載入的聯繫: 1. 都可以不重啟伺服器的情況下進行編譯/部署項目; 2. 基於 Java 的類載入器實現 熱部署與熱載入的區別: 熱部署在伺服器 運行時 重新部署項目 熱載入在運行時重新載入 class (位元組碼文件) 只載入重新修改後的類(class 文件) 熱部署 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...