国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

開發 前端
在查看 JAVA 應用拋出的異常堆棧以排查問題時,我們有時會看到所謂 suppressed exceptions,即被抑制的異常。理解 suppressed exceptions 的原理,對我們分析問題的底層真實原因大有裨益。所以本文分析總結下 Java 中的 suppressed exceptions。

1. 前言

在查看 JAVA 應用拋出的異常堆棧以排查問題時,我們有時會看到所謂 suppressed exceptions,即被抑制的異常。理解 suppressed exceptions 的原理,對我們分析問題的底層真實原因大有裨益。所以本文分析總結下 Java 中的 suppressed exceptions。

2. suppressed exceptions 機制總結

  • 簡單來說,suppressed exceptions 是 JVM 中一個真實發生了的異常,但由于某些原因被 JVM 忽略/抑制了;
  • 一個常見的異常被忽略/抑制的場景是 try-catch-finally 代碼塊:由于無論 try 代碼塊是否正常執行結束,finally 代碼塊都會執行,所以如果 try 代碼塊和 finally 代碼塊都拋出異常時,為在打印的異常堆棧中完整還原異常現場,代碼中可以做特殊處理(具體的處理方式見后文),以將兩個異常都打印,并標記 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.NullPointerException
at com.keep.bdata.SuppressedExceptionsDemo.demoExceptionWithNoSuppress(SuppressedExceptionsDemo.java:21)
at com.keep.bdata.SuppressedExceptionsDemo.givenNonExistentFileName_whenAttemptFileOpen_thenNullPointerException(SuppressedExceptionsDemo.java:12)

圖片圖片

  • 當 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)

圖片圖片

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)

圖片圖片

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()");
        }
    }


責任編輯:武曉燕 來源: 明哥的IT隨筆
相關推薦

2017-07-20 16:55:56

Android事件響應View源碼分析

2024-06-25 08:18:55

2021-04-07 13:28:21

函數程序員異步

2013-04-15 10:59:08

iOS開發ARC版本說明

2025-01-26 15:38:11

Spring事務編程式

2022-01-05 10:22:17

HiveAuthenticat認證

2015-07-15 17:09:48

HiveHadoop分布式文件系統

2020-10-09 08:15:11

JsBridge

2019-07-23 08:55:46

Base64編碼底層

2021-07-01 10:01:16

JavaLinkedList集合

2023-05-08 08:21:15

JavaNIO編程

2024-05-10 08:19:59

arthasjava字節碼

2024-01-30 09:31:53

SQL語言數據庫

2020-12-29 05:35:43

FlinkSQL排序

2025-03-07 10:04:12

2022-02-21 09:44:45

Git開源分布式

2021-06-30 00:20:12

Hangfire.NET平臺

2021-04-09 08:40:51

網絡保險網絡安全網絡風險

2023-05-12 08:19:12

Netty程序框架

2019-04-17 15:16:00

Sparkshuffle算法
點贊
收藏

51CTO技術棧公眾號

美女黄色免费看| 国产精品对白刺激| 久久免费视频1| 日本黄大片在线观看| 黄色亚洲网站| 一区二区在线观看av| 91精品视频网| 黄色成人av| 亚洲成av人片一区二区梦乃| 国产理论在线观看| 日韩福利在线播放| 综合激情五月婷婷| 亚洲自拍偷拍色图| 国模无码大尺度一区二区三区| 青青草原国产免费| 玉足女爽爽91| 成人在线免费观看黄色| 五月天久久比比资源色| 伊人精彩视频| 性欧美疯狂xxxxbbbb| 飘雪影视在线观看免费观看 | 亚洲最新在线视频| www免费在线观看| 欧美专区亚洲专区| 一级黄色录像免费看| 国产成人tv| av日韩免费电影| 26uuuu精品一区二区| 亚洲天堂av综合网| 400部精品国偷自产在线观看| 亚洲精品精选| 免费国产一区二区| 成人手机在线电影| 欧美久久久久免费| 久久精品亚洲成在人线av网址| 欧美大香线蕉线伊人久久| 9人人澡人人爽人人精品| 18+激情视频在线| 亚洲综合一区二区不卡| 国产视频一区二区在线| 欧美xxxhd| 欧美日韩在线免费观看视频| 中文字幕国产精品一区二区| 天堂在线看视频| 欧美图片一区二区三区| 国产精品高清一区二区| 成人两性免费视频| 美腿丝袜亚洲一区| 久久综合色播| 欧美成人一区二区三区片免费| 曰本一区二区| 国产一区二区三区av在线| 在线国产一区| 成人在线资源网址| 亚洲人成网www| 99视频免费观看| 日韩成人av在线播放| 成人免费一区二区三区牛牛| 99久久99久久综合| aa在线免费观看| 亚洲精品久久嫩草网站秘色| av剧情在线观看| 日韩av影片| 免费观看精品视频| 久久人人爽亚洲精品天堂| 九九视频精品免费| 欧洲一区二区三区精品| 国产一区二区三区在线免费| 精品国偷自产在线| 亚洲国产视频a| 丝袜美腿一区二区三区| av人人综合网| 亚洲中文字幕无码一区二区三区| 色偷偷久久人人79超碰人人澡 | 91蜜桃网址入口| 丝袜中文在线| 国产99午夜精品一区二区三区| 国产日产欧美一区二区三区| 在线手机中文字幕| 伊人久久青草| 欧美精品vⅰdeose4hd| 久久亚洲专区| 99精品在线免费视频| 亚洲伊人色欲综合网| 日韩另类视频| 成年人黄视频在线观看| 国产精品99导航| 一本一本久久a久久综合精品| 日韩欧美视频一区二区| 欧美日韩久久不卡| 日韩视频久久| 欧美极品少妇与黑人| 成人免费毛片片v| 欧美精品一二| 视频在线日韩| 午夜影院在线免费观看| 999久久欧美人妻一区二区| 26uuu国产精品视频| 日韩欧美激情在线| 久久新电视剧免费观看| 国产精品www.| 久久av影视| 在线观看黄色片| 国内不卡一区二区三区| 欧美高清精品3d| 亚洲欧美日韩精品一区二区| 丁香高清在线观看完整电影视频| 国产亚洲精品久久久久久久| 久久久亚洲天堂| 亚洲日本电影在线| 亚洲激情网址| 疯狂欧洲av久久成人av电影| 飘雪影视在线观看免费观看| 久久精品99国产精品酒店日本| 蜜臀av一级做a爰片久久| 蜜桃视频在线观看免费视频网站www| 国内精品一区视频| 欧美边添边摸边做边爱免费| 亚洲精品一区二区三区香蕉| 九九**精品视频免费播放| 不卡一区综合视频| www.神马久久| 成人性生交大片免费网站| 欧美日韩综合精品| 一区二区国产视频| 成人在线观看免费播放| 激情五月综合色婷婷一区二区| 亚洲免费在线视频一区 二区| 国产精品99久久99久久久| 日韩av在线免费观看一区| 激情另类小说区图片区视频区| 国产中文在线| 国产91在线亚洲| 成人动漫视频在线观看完整版 | 精品亚洲va在线va天堂资源站| 久久免费午夜影院| 国产成a人无v码亚洲福利| 九九在线精品视频| 国精产品一区一区三区mba视频| 国产一区二区三区久久悠悠色av| 国产91精品露脸国语对白| 国产激情视频一区二区三区欧美 | 91久久大香伊蕉在人线| 亚洲国产精品资源| 日韩网站在线看片你懂的| 午夜精品久久久久久久蜜桃app| 国产日韩欧美激情| 国产精品一区二区在线观看网站| 亚洲国产专区| 99热国内精品永久免费观看| 黄色网一区二区| 国产精品久久久久77777丨| 日本久久精品视频| 91精品99| 最新亚洲伊人网| 成人免费视频网站| 777午夜精品免费视频| 韩国一区二区视频| 国产一区二区三区视频在线| 男人j桶女人的网站| 成人www视频在线观看| 制服丝袜成人动漫| 国产一区二区三区日韩| 99香蕉久久| 丝袜视频国产在线播放| 欧美1o一11sex性hdhd| 国产视频丨精品|在线观看| 久久午夜免费电影| 成人精品中文字幕| 超碰成人av| 妞干网2018| 免费在线国产精品| 久热精品视频在线观看一区| 亚洲香肠在线观看| 久久福利资源站| 欧美深夜视频| 欧美成人二区| 男人亚洲天堂网| 91午夜理伦私人影院| 亚洲精品日韩在线| 一区二区三区精品久久久| 久久久蜜桃一区二区人| 精品一区二区三区四区五区| 青青草免费在线| 日本人妻伦在线中文字幕| 国产成人一区二区三区电影| 欧美电影免费观看完整版| 欧美极品少妇xxxxⅹ高跟鞋| 99视频精品| 都市激情亚洲| 五月花成人网| 一级片免费看| 久无码久无码av无码| 国产日韩精品一区二区| 国产婷婷成人久久av免费高清| 亚洲国产精品视频| 天堂网www中文在线| 色呦呦在线视频| japanese23hdxxxx日韩| 最新国产精品精品视频|