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

Epa*_*aga 6 java exception-handling

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

 String encodedString = URLEncoder.encode(foo, "utf-8");
Run Code Online (Sandbox Code Playgroud)

这个方法抛出一个UnsupportedEncodingException.哪个更好:

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

(强迫呼叫者自己捕捉)或者:

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

}
Run Code Online (Sandbox Code Playgroud)

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

sim*_*ord 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);
   }

}
Run Code Online (Sandbox Code Playgroud)

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

HTH

  • 另一种可能性是`抛出新的AssertionError("这不可能发生",ex)` (5认同)

pol*_*nts 6

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

如果声明一个方法抛出某些东西,那么应该存在它实际上做的情况.如果它几乎可以保证永远不会,那么最好throws完全省略该条款并简化您的API.

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