您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關finally中的異常會覆蓋try中的異常怎么辦的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
如下代碼, 最后在日志中只能看到 finally 中的異常,
雖然 try 中的邏輯出現了異常,但卻被 finally 中的異常覆蓋了。
這是非常危險的,特別是 finally 中出現的異常是偶發的,
就會在部分時候覆蓋 try 中的異常,讓問題更不明顯
至于異常為什么被覆蓋,原因也很簡單,
因為一個方法無法出現兩個異常
@GetMapping("wrong") public void wrong() { try { log.info("try"); //異常丟失 throw new RuntimeException("try"); } finally { log.info("finally"); throw new RuntimeException("finally"); } }
[13:34:42.247] [http-nio-45678-exec-1] [ERROR] [.a.c.c.C.[.[.[/].[dispatcherServlet]:175 ] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: finally] with root cause
java.lang.RuntimeException: finally
修復如下:(只拋出該拋出的異常)
/** * 修復方法一 */ @GetMapping("right") public void right() { try { log.info("try"); throw new RuntimeException("try"); } finally { log.info("finally"); try { throw new RuntimeException("finally"); } catch (Exception ex) { log.error("finally", ex); } } }
/** * 修復方法二 */ @GetMapping("right2") public void right2() throws Exception { Exception e = null; try { log.info("try"); throw new RuntimeException("try"); } catch (Exception ex) { e = ex; } finally { log.info("finally"); try { throw new RuntimeException("finally"); } catch (Exception ex) { if (e!= null) { e.addSuppressed(ex); } else { e = ex; } } } throw e; }
java.lang.RuntimeException: try
at org.geekbang.time.commonmistakes.exception.finallyissue.FinallyIssueController.right2(FinallyIssueController.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
Suppressed: java.lang.RuntimeException: finally
at org.geekbang.time.commonmistakes.exception.finallyissue.FinallyIssueController.right2(FinallyIssueController.java:75)
... 54 common frames omitted
感謝各位的閱讀!關于“finally中的異常會覆蓋try中的異常怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。