论坛首页 Java企业应用论坛

J2EE项目异常处理

浏览 83207 次
该帖已经被评为良好帖
作者 正文
   发表时间: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异常怎么理解?

望指教
0 请登录后投票
   发表时间: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用处真的不大.

个人观点,欢迎大家讨论.

0 请登录后投票
   发表时间: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异常,业务方法是我们最关心的。最需要去处理的。所以强制处理
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics