日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一篇文章徹底理解 Java 的 Suppressed exceptions 機制

來源: 責編: 時間:2024-05-17 17:47:19 234觀看
導讀1. 前言在查看 JAVA 應用拋出的異常堆棧以排查問題時,我們有時會看到所謂 suppressed exceptions,即被抑制的異常。理解 suppressed exceptions 的原理,對我們分析問題的底層真實原因大有裨益。所以本文分析總結下 Java

1. 前言

在查看 JAVA 應用拋出的異常堆棧以排查問題時,我們有時會看到所謂 suppressed exceptions,即被抑制的異常。理解 suppressed exceptions 的原理,對我們分析問題的底層真實原因大有裨益。所以本文分析總結下 Java 中的 suppressed exceptions。6Ys28資訊網——每日最新資訊28at.com

2. suppressed exceptions 機制總結

  • 簡單來說,suppressed exceptions 是 JVM 中一個真實發生了的異常,但由于某些原因被 JVM 忽略/抑制了;
  • 一個常見的異常被忽略/抑制的場景是 try-catch-finally 代碼塊:由于無論 try 代碼塊是否正常執行結束,finally 代碼塊都會執行,所以如果 try 代碼塊和 finally 代碼塊都拋出異常時,為在打印的異常堆棧中完整還原異?,F場,代碼中可以做特殊處理(具體的處理方式見后文),以將兩個異常都打印,并標記 try 中的異常為 suppressed;(用戶需要對異常代碼做處理);
  • 另一個常見的異常被忽略的場景是 try-with-resources 代碼塊:java7 引進了 try-with-resources 代碼塊和 AutoCloseable 接口來管理資源,當 try-with-resources 底層的業務邏輯代碼執行完畢時,無論其執行是否正常結束,jvm 都會自動關閉 try 中指定的 AutoCloseable 資源,以避免資源泄露,如果業務邏輯代碼的處理和 AutoCloseable 資源的關閉都發生了異常,此時 jvm 會將兩個異常都打印,并標記關閉 AutoCloseable 資源觸發的異常為try 中的異常為 suppressed;(用戶不用做特殊處理);
  • 所以,為有效利用 suppressed exceptions 機制妥善打印異常堆棧以輔助問題排查,從 Java 7 開始, 我們可以使用 Throwable 類的如下方法來處理 suppressed exceptions: 即 java.lang.Throwable#addSuppressed 和java.lang.Throwable#getSuppressed
  • A suppressed exception is an exception that is thrown but somehow ignored;
  • A common scenario for this is the try-catch-finally block: when the finally block throws an exception,any exception originally thrown in the try block is then suppressed;
  • Another common scenario is the try-with-resources block:Java 7 introduced the try-with-resources construct and the AutoCloseable interface for resource management,when exception occurs both in the business processing and resource closing,it’s the exception thrown in the close method that’s suppressed;
  • Starting with Java 7, we can now use two methods on the Throwable class to handle our suppressed exceptions: addSuppressed and getSuppressed.

3 suppressed exceptions 機制 細節- try-catch-finally 代碼塊

  • 當 finally 代碼塊沒有使用 java.lang.Throwable#addSuppressed 對異常進行特殊處理時,如果 try 代碼塊和 finally 代碼塊都拋出異常,打印的異常堆棧的示例如下,可以看到,沒有打印try 中的異常,而僅僅打印了 finally 中的異常,此時用戶顯然無法輕易獲知異常的真實原因;
java.lang.NullPointerExceptionat com.keep.bdata.SuppressedExceptionsDemo.demoExceptionWithNoSuppress(SuppressedExceptionsDemo.java:21)at com.keep.bdata.SuppressedExceptionsDemo.givenNonExistentFileName_whenAttemptFileOpen_thenNullPointerException(SuppressedExceptionsDemo.java:12)

圖片圖片6Ys28資訊網——每日最新資訊28at.com

  • 當 finally 代碼塊使用 java.lang.Throwable#addSuppressed 對異常進行了特殊處理時,如果 try 代碼塊和 finally 代碼塊都拋出異常,打印的異常堆棧的示例如下,可以看到,try 中的異常和 finally 中的異常都被打印了,且 try 中的異常被標記為 suppressed exceptions, 如果用戶理解 suppressed exceptions 的機制,通過這些異常堆棧,顯然可以輕松獲知異常的真實原因;
java.lang.NullPointerException	at com.keep.bdata.SuppressedExceptionsDemo.demoExceptionWithSuppressed(SuppressedExceptionsDemo.java:38)	at com.keep.bdata.SuppressedExceptionsDemo.givenNonExistentFileName_whenAttemptFileOpen_thenNullPointerException_withSuppressed(SuppressedExceptionsDemo.java:27)	Suppressed: java.io.FileNotFoundException: /non-existent-path/non-existent-file.txt (系統找不到指定的路徑。)		at java.io.FileInputStream.open0(Native Method)		at java.io.FileInputStream.open(FileInputStream.java:195)		at java.io.FileInputStream.<init>(FileInputStream.java:138)		at java.io.FileInputStream.<init>(FileInputStream.java:93)		at com.keep.bdata.SuppressedExceptionsDemo.demoExceptionWithSuppressed(SuppressedExceptionsDemo.java:33)

圖片圖片6Ys28資訊網——每日最新資訊28at.com

4 suppressed exceptions 機制 細節 - try-with-resources 代碼塊

  • java7 引進了 try-with-resources 代碼塊和 AutoCloseable 接口來管理資源,當 try-with-resources 底層的業務邏輯代碼執行完畢時,無論其執行是否正常結束,jvm 都會自動關閉 try 中指定的 AutoCloseable 資源,以避免資源泄露;
  • 如果業務邏輯代碼的處理和 AutoCloseable 資源的關閉都發生了異常,此時 jvm 會將兩個異常都打印,并標記關閉 AutoCloseable 資源觸發的異常為try 中的異常為 suppressed,打印的異常堆棧的示例如下,如果用戶理解 suppressed exceptions 的機制,通過這些異常堆棧,顯然可以輕松獲知異常的真實原因;
  • 注意這是jvm自己實現的,用戶不需要對代碼做特殊處理;
java.lang.IllegalArgumentException: Thrown from processSomething()	at com.keep.bdata.TryWithResourceDemo$ExceptionalResource.processSomething(TryWithResourceDemo.java:23)	at com.keep.bdata.TryWithResourceDemo.demoExceptionalResource(TryWithResourceDemo.java:17)	at com.keep.bdata.TryWithResourceDemo.givenNonExistentFileName_whenAttemptFileOpen_thenNullPointerException_suppressed(TryWithResourceDemo.java:12)	Suppressed: java.lang.NullPointerException: Thrown from close()		at com.keep.bdata.TryWithResourceDemo$ExceptionalResource.close(TryWithResourceDemo.java:28)		at com.keep.bdata.TryWithResourceDemo.demoExceptionalResource(TryWithResourceDemo.java:18)

圖片圖片6Ys28資訊網——每日最新資訊28at.com

5 suppressed exceptions 機制完整示例代碼

  • suppressed exceptions 機制的完整示例代碼如下(try-catch-finally ):
package com.keep.bdata;import org.junit.jupiter.api.Test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;publicclass SuppressedExceptionsDemo {    @Test    public void givenNonExistentFileName_whenAttemptFileOpen_thenNullPointerException() throws IOException {        demoExceptionWithNoSuppress("/non-existent-path/non-existent-file.txt");    }    public static void demoExceptionWithNoSuppress(String filePath) throws IOException {        FileInputStream fileIn = null;        try {            fileIn = new FileInputStream(filePath);        } catch (FileNotFoundException e) {            thrownew IOException(e);        } finally {            fileIn.close();        }    }    @Test    public void givenNonExistentFileName_whenAttemptFileOpen_thenNullPointerException_withSuppressed() throws IOException{        demoExceptionWithSuppressed("/non-existent-path/non-existent-file.txt");    }    public static void demoExceptionWithSuppressed(String filePath) throws IOException {        Throwable firstException = null;        FileInputStream fileIn = null;        try {            fileIn = new FileInputStream(filePath);        } catch (IOException e) {            firstException = e;        } finally {            try {                fileIn.close();            } catch (NullPointerException npe) {                if (firstException != null) {                    npe.addSuppressed(firstException);                }                throw npe;            }        }    }}
  • suppressed exceptions 機制的完整示例代碼如下(try-with-resources 完整示例代碼):
package com.keep.bdata;import org.junit.jupiter.api.Test;publicclass TryWithResourceDemo  {    @Test    public void givenNonExistentFileName_whenAttemptFileOpen_thenNullPointerException_suppressed() throws Exception {        demoExceptionalResource();    }    public void demoExceptionalResource() throws Exception {        try (ExceptionalResource exceptionalResource = new ExceptionalResource()) {            exceptionalResource.processSomething();        }    }    class ExceptionalResource implements AutoCloseable {        public void processSomething() {            thrownew IllegalArgumentException("Thrown from processSomething()");        }        @Override        public void close() throws Exception {            thrownew NullPointerException("Thrown from close()");        }    }


6Ys28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-88927-0.html一篇文章徹底理解 Java 的 Suppressed exceptions 機制

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一文徹底搞明白享元模式

下一篇: 在.Net開發中使用Math.NET Filtering開源庫實現巴特沃斯濾波器

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
在线国产日韩| 国产亚洲欧美中文| 免费亚洲视频| 欧美日韩99| 国产精品卡一卡二卡三| 国产手机视频一区二区| 影音先锋一区| 夜夜嗨av一区二区三区四区| 亚洲中午字幕| 免费观看在线综合| 国产精品精品视频| 影音先锋亚洲一区| 在线亚洲免费| 久久精品国产69国产精品亚洲| 欧美成人精品在线观看| 国产精品高潮呻吟久久av无限| 国内精品久久久久影院色| 亚洲精选视频免费看| 午夜精品福利在线| 免费看av成人| 国产精品色午夜在线观看| 在线观看欧美日韩| 亚洲欧洲av一区二区| 欧美大片在线观看一区| 国产精品人人做人人爽人人添| 在线观看中文字幕不卡| 亚洲在线观看免费视频| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲国产欧美一区二区三区同亚洲| 这里只有精品视频| 乱中年女人伦av一区二区| 国产精品草草| 91久久精品一区| 欧美中文字幕视频| 欧美日韩在线免费观看| 精品成人久久| 午夜精品久久久久久久久久久| 欧美成人精品一区二区三区| 国产婷婷一区二区| 亚洲视频视频在线| 欧美第十八页| 一区二区三区在线视频免费观看| 亚洲系列中文字幕| 欧美激情一区二区三区| 红桃视频国产精品| 欧美日韩国产综合网| 在线电影国产精品| 欧美在线不卡| 国产精品国产三级国产aⅴ浪潮| 亚洲福利国产精品| 欧美自拍偷拍午夜视频| 国产精品v欧美精品v日本精品动漫| 亚洲国产日韩综合一区| 久久久av网站| 国产农村妇女精品一二区| 99re6这里只有精品| 猛男gaygay欧美视频| 国内成人自拍视频| 欧美一区二区三区精品| 国产精品久久久久7777婷婷| 亚洲精品视频一区| 免费亚洲电影| 一区视频在线| 久久久噜噜噜久久中文字幕色伊伊| 国产精品入口66mio| 亚洲天天影视| 欧美色偷偷大香| 一本久道久久久| 欧美精品18| 亚洲精品午夜精品| 女人香蕉久久**毛片精品| 伊人影院久久| 狂野欧美激情性xxxx| 狠狠色丁香婷综合久久| 久久精品在线观看| 狠狠干综合网| 久久夜色精品国产欧美乱| 国产综合在线看| 久久久精品动漫| 欧美成在线观看| 亚洲国产成人午夜在线一区| 六十路精品视频| 亚洲电影专区| 欧美成人激情视频| 亚洲日韩成人| 欧美人与禽猛交乱配| 一级日韩一区在线观看| 欧美三级在线播放| 亚洲一区二区三区四区视频| 国产精品久久久久久久久免费桃花 | 国产日韩一区二区三区| 欧美在线高清| 黄色小说综合网站| 久久综合色天天久久综合图片| 伊人狠狠色j香婷婷综合| 美女91精品| 亚洲日本欧美在线| 欧美日韩亚洲一区二区三区在线| 中文一区在线| 国产区亚洲区欧美区| 久久久精品国产免大香伊| 1024亚洲| 欧美日韩在线精品| 欧美一区二区三区免费视频| 国产自产v一区二区三区c| 噜噜噜91成人网| 99国内精品久久| 国产精品免费aⅴ片在线观看| 午夜久久电影网| 激情视频一区| 欧美另类专区| 午夜精品成人在线| 亚洲成人在线免费| 欧美日韩另类丝袜其他| 亚洲综合第一页| 韩国v欧美v日本v亚洲v| 欧美大片一区| 亚洲一区二区三区四区中文| 国产午夜一区二区三区| 免费欧美高清视频| 亚洲视频在线一区观看| 国产一区二区丝袜高跟鞋图片| 免费观看在线综合| 亚洲视频欧美视频| 伊人色综合久久天天五月婷| 欧美日韩喷水| 久久精品人人爽| 日韩亚洲成人av在线| 国产欧美大片| 欧美成年人视频网站欧美| 亚洲综合日韩在线| 亚洲国产va精品久久久不卡综合| 欧美涩涩视频| 久久夜色精品国产欧美乱| 一区二区精品在线| 黄色精品一二区| 欧美日韩专区| 久久久午夜视频| 一区二区三区成人| 狠狠色丁香婷婷综合| 欧美日韩在线亚洲一区蜜芽| 久久久www成人免费毛片麻豆| 日韩一级免费| 国产在线视频欧美一区二区三区| 欧美精品九九| 欧美一区二区视频在线观看2020| 欧美激情精品久久久久久黑人| 亚洲一区二区三区免费观看| 亚洲国产99| 国产亚洲激情| 欧美天天影院| 免费观看一级特黄欧美大片| 午夜在线a亚洲v天堂网2018| 亚洲精品视频免费| 在线播放一区| 国产精品揄拍500视频| 欧美另类高清视频在线| 久久天天狠狠| 午夜精品福利一区二区三区av | 欧美精品亚洲| 久久久综合香蕉尹人综合网| 亚洲欧美日韩精品久久奇米色影视| 91久久精品网| 黑人巨大精品欧美一区二区小视频 | 久久久久成人精品| 亚洲香蕉网站| 亚洲精品视频免费在线观看| 国产综合在线看| 国产精品一区二区三区四区 | 欧美国产精品劲爆| 久久国产成人| 午夜精品久久久99热福利| 好吊成人免视频| 国产精品少妇自拍| 欧美私人网站| 欧美日韩亚洲一区二区三区在线观看 | 欧美黑人多人双交| 久久亚洲精品一区| 久久国产精品第一页| 亚洲欧美日韩中文播放| 夜夜躁日日躁狠狠久久88av| 亚洲韩国精品一区| 在线成人www免费观看视频| 国产亚洲一区二区三区在线观看| 国产精品国内视频| 国产精品porn| 欧美午夜理伦三级在线观看| 欧美精品一区三区在线观看| 免费看亚洲片| 久热成人在线视频| 久久这里只有| 久久一区欧美| 久久久久久69| 久久综合九色综合欧美就去吻| 久久精品二区三区| 久久不射网站| 久久精品国产一区二区三| 久久超碰97中文字幕| 午夜国产精品视频| 香蕉国产精品偷在线观看不卡| 午夜精品福利在线| 欧美专区日韩视频| 久久精品视频免费| 久久久99爱|