2016-10-14 127 views
-2

我想捕捉一個特定的異常並處理它,然後拋出一個執行代碼來處理任何異常的泛型異常。這是如何完成的?這段代碼不趕Exception等輸出在catch塊內拋出一個異常

Exception in thread "main" java.lang.Exception 
    at Main.main(Main.java:10) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
IOException specific handling 

Process finished with exit code 1 

的片段:

import java.io.IOException; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     try { 
     throw new IOException(); 
     } catch (IOException re) { 
     System.out.println("IOException specific handling"); 
     throw new Exception(); 
     } catch (Exception e) { 
     System.out.println("Generic handling for IOException and all other exceptions"); 
     } 
    } 
} 
+4

可能的重複[異常拋出內部catch塊 - 它會再次被捕獲?](http://stackoverflow.com/questions/143622/exception-thrown-inside-catch-block-will-it-be-caught-再次) –

+0

這種失敗的方式是什麼?由於已經打印了「IOException特定處理」消息,因此您已到達「catch」塊。然後,應用程序退出,出現異常,因爲您*拋出異常*。 – David

+0

@David我希望執行Exception塊中的代碼。 – newToScala

回答

1

您在IOException異常的捕捉塊拋出異常是從來沒有抓到。這就是爲什麼你必須添加「拋出異常」到你的主要方法。

爲了查找適合處理特定異常的catch-block,相同try之後的多個catch塊的行爲類似於if..else級聯。

嵌入整個在try..catch在另一個try..catch塊:

try { 
    try { 
    throw new IOException(); 
    } catch (IOException re) { 
    System.out.println("IOException specific handling"); 
    throw new Exception(); 
    } 
} catch (Exception e) { 
    System.out.println("Generic handling for IOException and all other xceptions"); 
    } 

通常一個嵌入原始異常在新通用的異常,讓你在最後的異常處理不鬆動的信息(例如,如果要記錄的堆棧跟蹤,以確定確切位置異常發生):

throw new Exception(re); 

,並在決賽中捕捉塊:

e.printStackTrace();