2013-05-28 24 views
-1

在以下代碼中引發了兩個異常[FatalException和MyException]。 Trivial Myexception(覆蓋?)使FatalException丟失。怎麼樣?如何在java中處理丟失的異常

如何處理這種情況?

try{ 
     try { 
     throw new FatalException("Important"); 
     } 
    finally 
    {    
      throw new MyException("trivial"); 
    } 
    }catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

沒有內部try塊的catch類。

(Article提到了它在Java中的缺陷例外!)所以應該有辦法克服它嗎?也許最近的標準改變了?

+2

相關:http://stackoverflow.com/q/4711064/335858 – dasblinkenlight

+5

處理它的方法是:不要寫這樣的代碼。 –

+0

@Matt Ball:不是我的代碼,我讀過這個! – Dineshkumar

回答

0

這是因爲執行順序。對於所有意圖和目的的初始throw是方法(閱讀:退出點)事實上的return語句,但因爲它是一個try塊內有finallyfinally保證內的代碼的方法之前運行退貨(with a few exceptions)。因此,在方法return/throw之前,會拋出不同的異常,這是較新的方法,可以在更早的方法返回時立即執行。

處理這種情況的方法永遠不會得到它。你應該知道,這是Java的行爲方式,並避免在這個角落編程。

+0

這不是它將運行的保證。如果我在最終執行前拉動電源怎麼辦? – Woot4Moo

+0

@ Woot4Moo如果你拉動電源,方法返回也不會發生。 –

+0

對,所以你的陳述是不正確的。 – Woot4Moo

0

我想這可能是你如何嵌套異常的正確結構。

try 
{ 
    // Some codes to be tried over here. 
} 
catch(FatalException fe) 
{ 
    System.out.println("Fatal Exception occurred."); 
} 
catch(Exception e) 
{ 
    System.out.println("Error! "); 
} 
catch(MyException me){} 

以這種方式,可以相應地捕獲異常。

+0

命令很重要,除非它繼承Throwable,否則MyException永遠不會被擊中。 – Woot4Moo

+0

catch(Exception)捕獲所有異常,不會再執行catch。 – Dineshkumar

2

有沒有辦法處理這個優雅的:finally接管在Java控制,讓你做任何你想要的,even return normally from a try block that threw an exception

如果你必須處理內部異常,你需要寫大量的潛在脆弱的代碼是:

Exception important = null; 
try{ 
    try { 
     important = new FatalException("Important"); 
    } finally { 
     if (important != null) throw important; 
     throw new MyException("trivial"); 
    } 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

你最好的辦法是不要寫這樣的代碼。

+0

你是對的,他需要一個潛在脆弱的代碼來處理這個問題。 –