项目中出现异常如何处理 经常要使用到ServletException和PersistenceException,亲们讲解一下 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以从内往外抛action时补获给出用户一个提示 比如 xxx失败请联系管理人员... 不同层的异常要转换,比如在logic或service层将PersistenceException转换为DataAccessException,因为异常也是接口的一个方面。 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> 经常要使用到ServletException和PersistenceException?经常使用到是啥意思哪?如果是经常出这种异常,哪就去找指定的地方 flex4 如何获得折线图上的值 SSH2高手来啊@~@~~~ 如何给java对象动态的设值 Java 操作Properties 读写问题 咋实现自定义审批流程呢 寻求解决方案 求书:J2EE专业项目实例开发 已和关于struts标签嵌套的问题,敬请赐教。 jsp+javamail发送日文邮件乱码问题,急啊>_< ××××用过nokia wap toolkit的熟手请进来! ibatis配置问题 myeclipse中操作问题
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>
经常使用到是啥意思哪?
如果是经常出这种异常,哪就去找指定的地方