2012-04-27 116 views
0
重新拋出時

比較這兩種方法:鑄造異常在Java中

void foo() throws SomeSuperException { 
    try { 
     //... 
    } catch (SomeSuperException e) { 
     if (e instanceof SomeSubException) { 
      throw e; 
     } 
    } 
} 

void bar() throws SomeSubException { 
    try { 
     //... 
    } catch (SomeSuperException e) { 
     if (e instanceof SomeSubException) { 
      throw (SomeSubException) e; 
     } 
    } 
} 
從方法簽名

除了(巴可宣佈throws SomeSubException代替throws SomeSuperException),有兩種方法之間的任何實際的區別嗎?

要清楚:我知道這是一種異常處理的可怕方法,不應該這樣做!

回答

3

不同之處在於,在第一種情況下,外部來電者不知道您的具體SomeSubException,因此翻譯中丟失了一些細節。

1

不,沒有(大)差異。 從普通的角度來看,它是拋出最具體的例外的最佳選擇,沒有超級或更廣泛的例外。這使您可以在覆蓋catchBlock中處理更多的案例。

+1

這實際上取決於,如果子異常鏈接到實現的細節,可能是一個好主意,拋出超級異常來隱藏這些細節給調用者。 – assylias 2012-04-27 12:53:21

+0

那是真的;)... – Thkru 2012-04-27 12:54:04

+1

@assylias:所以你說這是規則的例外嗎? :-) – atk 2012-04-27 12:54:52