假设我在方法中有以下行:
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!");
}
}
或者是否有更优雅的方式来处理实际上不会发生的异常?
答案 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项)。声明你可能会抛出一些东西,当它保证永远不会发生时,会打破这个设计准则。