那么在设计方法的异常时,我们应该选用CheckedException还是UncheckedException呢?这纯粹是一个设计问题,没有普适的原则。在我们的业务系统中,通常采取这样的约定:
1. 将业务级的异常设计为CheckedException。 如果该方法认为其调用者应该去关注、处理它所抛出的异常,那么定义为CheckedException。
举例1:登录程序校验用户名、密码是否匹配的方法
Public void login(String username,String passwd) throws AccountNotMatchedException {
If (username and password not in db) {
Throw new AccountNotMatchedException(“username not matched”,1);
}
}
在这个应用场景里,login方法显然期望调用者去关注处理AccountNotMatchedException。所以 AccountNotMatchedException 应该设计为CheckedExcetpion。
2. 将一些底层的异常设计为UncheckedException。如果该方法认为其调用者不会或者不应该去关注、处理它所抛出的异常,那么定义为UncheckedException.
举例2:数据库操作方法:
Public int executeUpdate(String sql,Object[] params) {
if fail to get database connection {
throw DBAccessException.
}
}
该方法通常面向DAO方法。显然大多数情况下executeUpdate方法并不指望DAO方法会处理数据库连接失败的异常。所以应该将DBAccessException
设计成UncheckedException.
当然调用者也可以根据实际需要,将捕获到的异常重新构造成ChecedException或者UncheckedException。Jdk1.4及其以后版本的JDK已经支持链式异常,可以方便地对原有异常进行封装,而又不失去去原来信息。