-
4.異常捕獲后再次拋出
-
情況一:捕獲后拋出原來的異常,希望保留最新的異常拋出點--fillStackTrace
-
情況二:捕獲后拋出新的異常,希望拋出完整的異常鏈--initCause
- 1.捕獲后重新拋出捕獲的異常
- 在函數中捕獲了異常,在catch模塊中不做進一步的處理,而是向上一級進行傳遞
- catch(Exception e){
- throw e;
- }
public class ReThrow { public static void f()throws Exception{ throw new Exception("Exception: f()"); } public static void g() throws Exception{ try{ f(); }catch(Exception e){ System.out.println("inside g()"); throw e; } } public static void main(String[] args){ try{ g(); } catch(Exception e){ System.out.println("inside main() function"); e.printStackTrace(System.out); } } }
運行結果如下:
inside g()
inside main() function
java.lang.Exception: Exception: f()
at ReThrow.f(ReThrow.java:6)
//異常的拋出點還是最初拋出異常的函數f()
at ReThrow.g(ReThrow.java:11)
at ReThrow.main(ReThrow.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
- 2.fillStackTrace——覆蓋前邊的異常拋出點(獲取最新的異常拋出點)
- 在此拋出異常的時候進行設置
- catch(Exception e){
- (Exception)e.fillInStackTrace();
- }
public static void g() throws Exception{ try{ f(); }catch(Exception e){ System.out.println("inside g()"); throw (Exception)e.fillInStackTrace(); } }
運行結果如下:
inside g()
inside main() function
java.lang.Exception: Exception: f()
at ReThrow.g(ReThrow.java:14) //顯示的就是最新的拋出點
at ReThrow.main(ReThrow.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
- 3.捕獲異常后拋出新的異常( 區別於捕獲異常之后重新拋出)
- 方式1:Exception e=new Exception();----important
- e.initCause(ex);
- 方式2:
- Exception e =new Exception(ex);
-
public void f(){ try{ g();//throws NullPointException }catch(NullPointException ex){ ex.printStasckTrace(); Exception e=new Exception(); e.initCause(ex);//就可以看到原始的異常保留下來 throw e; } }
- 運行結果:
- java.lang.Exception
- at Main.g(Main.java:14)
- at Main.main(Main.java:22)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.lang.reflect.Method.invoke(Method.java:606)
- at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
- Caused by: java.lang.NullPointerException
- at Main.f(Main.java:6)
- at Main.g(Main.java:11)
- ... 6 more