锁定老帖子 主题:J2EE项目异常处理
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-15
引用 一般地,我们需要定义一个unChecked异常,让集成层接口的所有方法都声明抛出这unChecked异常。 java 代码 public DataAccessException extends RuntimeException{ …… } public interface UserDao{ public String getPassword(String userId)throws DataAccessException; } public class UserDaoImpl implements UserDAO{ public String getPassword(String userId)throws DataAccessException{ String sql = “select password from userInfo where userId= ‘”+userId+”’”; try{ … //JDBC调用 s.executeQuery(sql); … }catch(SQLException ex){ throw new DataAccessException(“数据库查询失败”+sql,ex); } } } 定义一个checked的业务异常,让业务层的接口的所有方法都声明抛出unChecked异常. java 代码 public class BusinessException extends Exception{ ….. } public interface UserManager{ public Userinfo copyUserInfo(Userinfo user)throws BusinessException{ Userinfo newUser = null; try{ newUser = (Userinfo)user.clone(); }catch(CloneNotSupportedException ex){ throw new BusinessException(“不支持clone方法:”+Userinfo.class.getName(),ex); } } } 不好意思,两个问题 1) 接口UserDao应该可以把throws DataAccessException 拿掉 2) 定义一个checked的业务异常,让业务层的接口的所有方法都声明抛出unChecked异常. 这句话对么?定义了BusinessException这个checked异常,public Userinfo copyUserInfo(Userinfo user)throws BusinessException,让业务层的接口的所有方法都声明抛出unChecked异常怎么理解? 望指教 |
|
返回顶楼 | |
发表时间:2007-07-16
我的想法:
1/ 根据系统的分层,每层自定义一个unchecked exception, exception里面只包含简单的message信息即可, 这样每层实现时,只需要抛出本层定义的exception并提供信息就可以了; 2/ 还是根据系统分层,高层在调用底层的api时,一定要捕获底层定义的这个exception(不过推荐是catch Exception()),并根据本层的logic决定是继续抛出本层的exception还是进行其他处理; 3/ 提供一个util方法可以拿到root exception的message,这样可以保证即使进行多次包装后,也能得到最初抛出exception的信息; 4/ checked exception能不用就不用,除非有业务逻辑需要通过exception来实现不同的流程(这种情况通常也是可以避免的),还有就是涉及到资源的情况,有可能必须使用checked exception,不过一般来说,这种情况都可以限制在本层内部,通过catch and rethrow我们自定义的异常来解决,只是需要注意在finally里面把资源释放掉. 曾经使用别人提供的api,里面会抛出一个自定义checked exception,可是我这边的logic非常复杂,涉及到3到4层的调用,如果每层都try catch的话....最终只能将这个checked exception包装成一个unchecked exception...世界清净了 一般来说,不管是抛出何种异常,就代表logic已经发生错误,而且基本不太可能恢复,所以checked exception用处真的不大. 个人观点,欢迎大家讨论. |
|
返回顶楼 | |
发表时间:2007-07-16
jerrycong 写道 引用 一般地,我们需要定义一个unChecked异常,让集成层接口的所有方法都声明抛出这unChecked异常。 java 代码 public DataAccessException extends RuntimeException{ …… } public interface UserDao{ public String getPassword(String userId)throws DataAccessException; } public class UserDaoImpl implements UserDAO{ public String getPassword(String userId)throws DataAccessException{ String sql = “select password from userInfo where userId= ‘”+userId+”’”; try{ … //JDBC调用 s.executeQuery(sql); … }catch(SQLException ex){ throw new DataAccessException(“数据库查询失败”+sql,ex); } } } 定义一个checked的业务异常,让业务层的接口的所有方法都声明抛出unChecked异常. java 代码 public class BusinessException extends Exception{ ….. } public interface UserManager{ public Userinfo copyUserInfo(Userinfo user)throws BusinessException{ Userinfo newUser = null; try{ newUser = (Userinfo)user.clone(); }catch(CloneNotSupportedException ex){ throw new BusinessException(“不支持clone方法:”+Userinfo.class.getName(),ex); } } } 不好意思,两个问题 1) 接口UserDao应该可以把throws DataAccessException 拿掉 2) 定义一个checked的业务异常,让业务层的接口的所有方法都声明抛出unChecked异常. 这句话对么?定义了BusinessException这个checked异常,public Userinfo copyUserInfo(Userinfo user)throws BusinessException,让业务层的接口的所有方法都声明抛出unChecked异常怎么理解? 望指教 1)那是不对滴。为什么要让Dao抛出unChecked异常呢?就是进行一次封装!让上层调用者自己决定处理dao的异常 2)如果让业务方法都抛出unChecked异常,业务方法是我们最关心的。最需要去处理的。所以强制处理 |
|
返回顶楼 | |