抑制或抛出永远不会发生的异常?

时间:2010-03-10 09:38:46

标签: java exception-handling

假设我在方法中有以下行:

 String encodedString = URLEncoder.encode(foo, "utf-8");

此方法抛出UnsupportedEncodingException。哪个更好:

/** @throws UnsupportedEncodingException umm...never
 */
public void myMethod() throws UnsupportedEncodingException {
   ...
   String encodedString = URLEncoder.encode(foo, "utf-8");
   ...
}

(强迫来电者亲自捕捉)或者:

public void myMethod() {
   try {
     ...
     String encodedString = URLEncoder.encode(foo, "utf-8");
     ...
   catch(UnsupportedEncodingException e) {
      Logger.log("cosmic ray detected!");
   }

}

或者是否有更优雅的方式来处理实际上不会发生的异常?

2 个答案:

答案 0 :(得分:18)

永远不要说永远;)

在上面的示例中,您始终可以捕获异常,然后抛出RuntimeException:

public void myMethod() {
   try {
      ...
      String encodedString = URLEncoder.encode(foo, "utf-8");
       ...
   } catch(UnsupportedEncodingException e) {
     throw new RuntimeException("This should not be possible",e);
   }

}

这样调用者就不会被迫抓住99.999%肯定永远不会发生的东西,但是在疯狂的事件中确实会发生这种事情,你仍然会得到一个异常泡泡,直到你希望注意到它并且是能够快速意识到改变了什么并修复它。

HTH

答案 1 :(得分:6)

如果你几乎可以保证异常永远不会发生,那么最好在最狭窄的范围内本地化这个断言而不是让它传播,因为其他人可能没有意识到这是案件没有看文件。

如果声明某个方法抛出某个东西,那么应该存在实际执行的方案。如果几乎可以保证永远不会这样做,那么最好完全省略throws子句并简化您的API

您应该始终抛出适合您的抽象级别的异常( Effective Java 2nd Edition ,第61项)。声明你可能会抛出一些东西,当它保证永远不会发生时,会打破这个设计准则。