当前位置:编程学习 > JAVA >>

DAO层异常集中处理

eclipse中自己写DAO层接口实现时,eclipse会提示未捕获SQL异常,因此不得不在每个方法后面加上throws SQLException ,这样的话service,action层中方法都要throws SQLException ,这样太麻烦了,有没有一个集中处理异常的方法呢?求大神指教!

package com.daoImpl;

import java.sql.SQLException;
import java.util.List;

import com.dao.SysUserDao;
import com.entity.SysUser;
import com.ibatis.sqlmap.client.SqlMapClient;

public class SysUserDaoImpl implements SysUserDao {

private SqlMapClient sqlMapClient;

public SqlMapClient getSqlMapClient() {
return sqlMapClient;
}

public void deleteSysUser(SysUser sysUser) throws SQLException {
sqlMapClient.queryForObject("deleteSysUser", sysUser);
}

@SuppressWarnings("unchecked")
public List<SysUser> getSysUserList(SysUser sysUser) throws SQLException {
return (List<SysUser>) sqlMapClient.queryForObject("getSysUserList",sysUser);
}

public void insertSysUser(SysUser sysUser) throws SQLException {
sqlMapClient.queryForObject("insertSysUser", sysUser);
}

public void updateSysUser(SysUser sysUser) throws SQLException {
sqlMapClient.queryForObject("updateSysUser", sysUser);
}

}
--------------------编程问答-------------------- 貌似没有吧? --------------------编程问答-------------------- DAO层抛出异常,service和action调用此DAO时,如果不catch或者继续throws到上层的话,编译能通过吗?

如果不出问题还好,要是出了问题,没有异常信息,怎么定位原因?

调用谁就要用谁的规则,是懒得写,还是觉得这样写没必要呢? --------------------编程问答-------------------- 使用hibernate 就不用这么抛了 --------------------编程问答--------------------
引用 2 楼 lrbyantai 的回复:
DAO层抛出异常,service和action调用此DAO时,如果不catch或者继续throws到上层的话,编译能通过吗?

如果不出问题还好,要是出了问题,没有异常信息,怎么定位原因?

调用谁就要用谁的规则,是懒得写,还是觉得这样写没必要呢?
不是说不捕获异常,像这样每个方法后面都throws SQLException 或者每个方法体内都try,catch,是不是显得太麻烦了,我想问怎样把dao层处理异常封装一下,然后继承这个dao. --------------------编程问答--------------------
引用 3 楼 qiyuexuel 的回复:
使用hibernate 就不用这么抛了
一直用ibatis,没用过hibernate  --------------------编程问答-------------------- @楼主,我只是想表达一下每个方法throws或者try,catch的必要性。和麻烦不麻烦没关系,语法就是这样

回过头来看你提的问题。DAO层异常集中处理,“集中处理”应该是越往上层才越有必要,越往底层越要细分。对于整个应用来说,DAO层算是比较底层的东西。为什么要在这一层“集中”处理呢。感觉有点怪怪的 --------------------编程问答--------------------
引用 6 楼 lrbyantai 的回复:
@楼主,我只是想表达一下每个方法throws或者try,catch的必要性。和麻烦不麻烦没关系,语法就是这样

回过头来看你提的问题。DAO层异常集中处理,“集中处理”应该是越往上层才越有必要,越往底层越要细分。对于整个应用来说,DAO层算是比较底层的东西。为什么要在这一层“集中”处理呢。感觉有点怪怪的
嗯,怎么说呢?在公司,我们用的都是公司封装好的东西,DAO层直接继承就可以了,这个时候在eclipse中写方法就不用throws或try,catch,因为它已经帮你封装好了。但是如果我自己在dao层写方法,没有继承其他类,这个时候eclipse就会提示未捕获的sql异常了。当然,异常是要catch的,不过话又说回来,如果您自己写dao,不可能在每个方法后面都加上throws SQLException吧?我想表达的意思是有没有一种实现方法能对dao层的sql异常进行处理,从而方法的后面不再加throws SQLException,因为dao层不加throws SQLException,eclipse会报错。 --------------------编程问答--------------------


    public void updateSysUser(SysUser sysUser)  {
try{
        sqlMapClient.queryForObject("updateSysUser", sysUser);
}catch(SQLException e){
  throw new RuntimeExcption(e)
}
    }

--------------------编程问答-------------------- 因为ibatIS是直接使用sql进行数据库操作,故一定是要抛出SQLException,要么throws,要么try catch 
hibernate是对持久化操作进行了简单包装,将异常包进去,我们才看不见的。同理你在dao层方法中使用try catch,在service层调它的时候不也看不见它抛出异常么 --------------------编程问答-------------------- @楼主,如8楼代码所示。所谓的你公司封装好的东西。无非是他自己在类中进行了try,catch操作(catch块中不再继续往上throw)。这样即使封装好的东西如果抛了异常,你也无法在上层中获取到。纠结这个干什么 --------------------编程问答-------------------- 必须得try 或throw --------------------编程问答-------------------- 换mybatis吧 和ibatis没什么差别
dao里面就是不用抛异常
@Repository("coprMoudleDao")
public class CoprMoudleDao extends BaseDao<CoprMoudle,Integer> {

@Override
public Class getEntityClass() {
return CoprMoudle.class;
}

public Integer checkExistById(CoprMoudle cm) {
return this.selectCount("CoprMoudle.checkExistById", cm);
}

public Integer checkExistByName(CoprMoudle cm) {
return this.selectCount("CoprMoudle.checkExistByName", cm);
}

public void updateById(CoprMoudle cm) {
this.update("CoprMoudle.updateById", cm);
}

public void updateByName(CoprMoudle cm) {
this.update("CoprMoudle.updateByName", cm);
}

}
--------------------编程问答-------------------- 需要集中处理异常的地方可以用Spring的AOP技术去实现一下试试
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,