2012-04-27 120 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