日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

重新抛出异常与异常链

發布時間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重新抛出异常与异常链 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

重新拋出異常

如果我們直接重新拋出異常,那么當我們后續捕獲此異常時并不會產生重新拋出地的信息。但是當我們需要重新拋出一個異常時我們顯然希望能獲得重新拋出點的信息,這時我們需要使用fillInStackTrace()方法,它通過把當前異常調用棧信息填入原來的異常對象而返回一個Throwable,所以我們需要將它強制轉型為Exception再將其拋出。

import java.io.*; class ExceptionTest{public static void fun1() throws IOException{throw new IOException("fun1()");}public static void fun2() throws IOException{throw new IOException("fun2()");} }public class FuUse{/** invoke1()使用fillInstackTrace()方法拋出* */private static void invoke1() throws Exception{try {ExceptionTest.fun1();}catch (IOException e){/** 將異常調用棧軌跡信息重定向到System.out中* 默認是System.err。* */e.printStackTrace(System.out);/** e.fillInStackTrace()返回的是Throwable類型* */throw (Exception)e.fillInStackTrace();}}/** invoke2()直接重新拋出異常* */private static void invoke2() throws Exception{try {ExceptionTest.fun1();}catch (IOException e){e.printStackTrace(System.out);throw e;}}public static void main(String[] args){try {invoke1();} catch (Exception e) {e.printStackTrace(System.out);}System.out.println("----------------------------------");try {invoke2();} catch (Exception e) {e.printStackTrace(System.out);}} } /* *output: java.io.IOException: fun1()at ExceptionTest.fun1(FuUse.java:4)at FuUse.invoke1(FuUse.java:18)at FuUse.main(FuUse.java:49) java.io.IOException: fun1()at FuUse.invoke1(FuUse.java:30)at FuUse.main(FuUse.java:49) ---------------------------------- java.io.IOException: fun1()at ExceptionTest.fun1(FuUse.java:4)at FuUse.invoke2(FuUse.java:39)at FuUse.main(FuUse.java:55) java.io.IOException: fun1()at ExceptionTest.fun1(FuUse.java:4)at FuUse.invoke2(FuUse.java:39)at FuUse.main(FuUse.java:55) * */

可以看到invoke2()中兩個不同的拋出點都輸出了通用的棧軌跡信息,而invoke1()中產生了重新拋出點的信息。

?

異常鏈

常常會在捕獲一個異常后拋出另一個異常,并且希望把原始的異常信息保存下來,這被稱為異常鏈。

這種情況可以舉一個例子。比如針對用戶來說,我們希望提供給他們的錯誤信息將細節隱藏,并使錯誤表達的簡單明了。這時我們建立需要的自定義異常,在捕獲到一些用戶不需要知道的異常時,我們將用戶易懂的自定義異常拋出(這種行為往往用來轉換異常)。但是作為開發者我們需要知道異常發生的細節,現在就需要使用異常鏈的功能來實現。

import java.io.*; /* * 自定義異常WrongOperationException * */ class WrongOperationException extends Exception{}class ExceptionTest{public static void fun() throws IOException{throw new IOException();} } public class FuUse{private static void invoke1() throws WrongOperationException{try {ExceptionTest.fun();}catch (IOException e){/** 將原異常對象設置為新異常對象的“原由”* initCase();* */WrongOperationException wrongOperation = new WrongOperationException();wrongOperation.initCause(e);throw wrongOperation;}}public static void main(String[] args){try {invoke1();} catch (WrongOperationException e) {e.printStackTrace(System.out);}} } /* *output: WrongOperationExceptionat FuUse.invoke1(FuUse.java:17)at FuUse.main(FuUse.java:26) Caused by: java.io.IOExceptionat ExceptionTest.fun(FuUse.java:5)at FuUse.invoke1(FuUse.java:15)... 1 more * */

當我們在捕獲受查異常時,有時我們想在捕獲到這個異常時不做處理直接終止程序。這時我們可以利用異常鏈的原理將受查異常當成非受查異常的原由。這就在形式上將受查異常轉換成了非受查異常。

import java.io.*; class ExceptionTest{public static void fun() throws IOException{throw new IOException();} } public class FuUse{private static void invoke1(){try {ExceptionTest.fun();}catch (IOException e){/** 將原異常對象設置為非受查異常對象的“原由”* */RuntimeException runtimeException = new RuntimeException();runtimeException.initCause(e);throw runtimeException;}}public static void main(String[] args){invoke1();} } /* *output: Exception in thread "main" java.lang.RuntimeExceptionat FuUse.invoke1(FuUse.java:16)at FuUse.main(FuUse.java:24) Caused by: java.io.IOExceptionat ExceptionTest.fun(FuUse.java:4)at FuUse.invoke1(FuUse.java:11)... 1 more * */

?

轉載于:https://www.cnblogs.com/old-driver-lgq/p/10806271.html

總結

以上是生活随笔為你收集整理的重新抛出异常与异常链的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。