日期:2014-05-20  浏览次数:20768 次

项目中出现异常如何处理
经常要使用到ServletException和PersistenceException,亲们讲解一下

------解决方案--------------------
1. dao层
dao层异常处理的整体思路是:转为运行时异常(如果是就不用转了),抛出。可以分为两种情况:
1) 异常为运行时异常
如果异常本身就是运行时异常(大多数情况都是),自动抛出即可。
2) 异常不是运行时异常
如果不是运行时异常,我们需要将她转为自定义的运行时异常。自定义运行时异常类需要继承我们编写的异常基类:
public abstract class BaseException extends RuntimeException {

private static final long serialVersionUID = 2761768844467932982L;
public BaseException() {
super();
}
public BaseException(String message, Throwable cause) {
super(message, cause);
}
public BaseException(String message) {
super(message);
}
public BaseException(Throwable cause) {
super(cause);
}
}
比方说我们现在自定义了一个异常类:RemoteCallException。在我们的dao层中有一个普通异常需要处理。
try{
//相应逻辑代码
}catch(IOException e){
throw new RemoteCallException();
//日志记录
}
通过上述代码我们就将非运行时异常转换为运行时异常并抛出。在我看来转为运行时异常更多的是为事务回滚去考虑,如果我们不抛出,那么service层认为我们的dao层没有问题,事务也就提交。在注解式的事务管理中,默认事务回滚的异常就为运行时异常。
2. service层
service层抛出检查异常,此异常也为自定义的。我们统一为service层自定义一个已检查异常。如下:
public class ServiceException extends Exception{

private static final long serialVersionUID = 1L;
public ServiceException() {
super();
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
public ServiceException(String message) {
super(message);
}
public ServiceException(Throwable cause) {
super(cause);
}
}
在service层中抛出我们自定义的异常:
public void addUser(User user) throws ServiceException{
userDao.saveUser(user);
}
在service层中抛出已检查异常,主要是考虑到如果我们继续抛出未检查异常,那么在action中可能不能得到处理。
3. action层
在action层中try……catch…..异常,然后统一抛出。例子如下:
try{
userService.addUser(user);
}catch(Exception e){
throw new ActionException(“开卡失败”);
}
return SUCCESS;

ActionException的定义同SeviceException。
利用struts2拦截器去处理。
<global-exception-mappings><!—异常类和跳转页面配置 -->
<exception-mapping result="error" exception="com.hxzx.card.exception.ServiceException"/>
</global-exception-mappings>

配置错误页面如下:
<body>
操作失败 ——${ exception.message}
</body>