重新抛出异常与异常链
生活随笔
收集整理的這篇文章主要介紹了
重新抛出异常与异常链
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
重新拋出異常
如果我們直接重新拋出異常,那么當我們后續捕獲此異常時并不會產生重新拋出地的信息。但是當我們需要重新拋出一個異常時我們顯然希望能獲得重新拋出點的信息,這時我們需要使用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
總結
以上是生活随笔為你收集整理的重新抛出异常与异常链的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解EBS接口开发之采购申请导入
- 下一篇: 一道关于比赛胜负的Sql查询题目