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
如果你几乎可以保证异常永远不会发生,那么最好在最狭窄的范围内本地化这个断言而不是让它传播,因为其他人可能没有意识到这是没有查看文档的情况.
如果声明一个方法抛出某些东西,那么应该存在它实际上做的情况.如果它几乎可以保证永远不会,那么最好throws完全省略该条款并简化您的API.
您应该始终抛出适合您的抽象级别的异常(Effective Java 2nd Edition,第 61项).声明你可能会抛出一些东西,当它保证永远不会发生时,会打破这个设计准则.
| 归档时间: |
|
| 查看次数: |
3367 次 |
| 最近记录: |