4.異常捕獲后再次拋出


  • 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
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM