统一异常处理
1.1 统一异常结果类型
Java中进行异常处理:
一类是可预知的异常,程序员在编码时,主动抛出的异常,为了给用户操作提示,提前检查代码中可能存在异常。
通过开发中,采用自定义的异常类,每个异常类表示每一类异常信息。类需要继承Exception类。
本系统采用统一异常类,提供一个属性标识异常类。
另一类是不可预知异常,就是runtimeException异常,通过提高代码编写质量来避免此类异常,也可通过后期测试 人员进行系统功能测试对runtime异常进行避免。
如何使用异常类?
在service中要抛出此异常类。
在action或者Controller中捕获系统自定义异常,解析系统自定义异常。
解析系统自定义异常过程:
如果抛出的ExceptionResultInfo系统自定义异常,直接获取该异常信息即可。
如果不是抛出的ExceptionResultInfo系统自定义异常,重新构造一个“未知错误异常!”。
将异常信息或成功信息返回到页面:
统一使用类SubmitResultInfo,提交类的方法统一使用该类型作为返回值类型。
由于action中所有的提交类方法统一返回SubmitResultInfo,所以在页面要统一使用一个方法解析json结果。
修改回调函数:
function sysusersave_callback(data){
message_alert(data);
}
1.2 统一异常处理器
Springmvc提供统一处理器机制,springmvc的前端控制器在调用适配器,去调用action,过程中如果发生异常,前端控制器交给异常处理器进行异常处理。
前端控制器源代码:
1.2.1 自定义异常处理器流程
对dao、service及action所抛出的异常进行统一处理,在action中就不需要添加try{}catch{}捕获的代码。
1.2.2 自定义异常处理器编写
自定义全局异常处理器,实现HandlerExceptionResolver接口
public class ExceptionResolverCustom implements HandlerExceptionResolver {
// json转换器
// 将异常信息转json
private HttpMessageConverter<ExceptionResultInfo> jsonMessageConverter;
// 前端控制器调用此方法执行异常处理
// handler,执行的action类就包装了一个方法(对应url的方法)
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
// 输出 异常信息
ex.printStackTrace();
// 转成springmvc底层对象(就是对action方法的封装对象,只有一个方法)
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 取出方法
Method method = handlerMethod.getMethod();
// 判断方法是否返回json
// 只要方法上有responsebody注解表示返回json
// 查询method是否有responsebody注解
ResponseBody responseBody = AnnotationUtils.findAnnotation(method,
ResponseBody.class);
if (responseBody != null) {
// 将异常信息转json输出
return this.resolveJsonException(request, response, handlerMethod,
ex);
}
// 这里说明action返回的是jsp页面
// 解析异常
ExceptionResultInfo exceptionResultInfo = resolveExceptionCustom(ex);
// 将异常信息在异常页面显示
request.setAttribute("exceptionResultInfo",
exceptionResultInfo.getResultInfo());
// 转向错误页面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exceptionResultInfo",
exceptionResultInfo.getResultInfo());
modelAndView.setViewName("/base/error");// 逻辑视图名
return modelAndView;
}
// 异常信息解析方法
private ExceptionResultInfo resolveExceptionCustom(Exception ex) {
ResultInfo resultInfo = null;
if (ex instanceof ExceptionResultInfo) {
// 抛出的是系统自定义异常
resultInfo = ((ExceptionResultInfo) ex).getResultInfo();
} else {
// 重新构造“未知错误”异常
resultInfo = new ResultInfo();
resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL);
resultInfo.setMessage("未知错误!");
}
return new ExceptionResultInfo(resultInfo);
}
// 将异常信息转json输出
private ModelAndView resolveJsonException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
// 解析异常
ExceptionResultInfo exceptionResultInfo = resolveExceptionCustom(ex);
HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
try {
//将exceptionResultInfo对象转成json输出
jsonMessageConverter.write(exceptionResultInfo, MediaType.APPLICATION_JSON, outputMessage);
} catch (HttpMessageNotWritableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new ModelAndView();
}
public HttpMessageConverter<ExceptionResultInfo> getJsonMessageConverter() {
return jsonMessageConverter;
}
public void setJsonMessageConverter(
HttpMessageConverter<ExceptionResultInfo> jsonMessageConverter) {
this.jsonMessageConverter = jsonMessageConverter;
}
}
1.2.3 统一异常处理器配置
在springmvc.xml配置统一异常处理器。
在web.xml中配置:
前端控制器知道全局异常处理器id为handlerExceptionResolver
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<init-param>
<param-name>detectAllHandlerExceptionResolvers</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
detectAllHandlerExceptionResolvers:
屏蔽自动注册异常处理器,固定使用bean的id为handlerExceptionResolver的异常处理器。
1.2.4 统一异常处理器使用
系统中所有异常由全局异常处理器处理。
Dao方法向外抛出系统自定义异常。
Service方法向外抛出系统自定义异常。
Action方法向外抛出系统自定义异常。
1.2.5 统一异常处理器测试
1、 在action的提交方法中发生异常,由全局异常处理器进行处理。
2、在action返回jsp方法中发生异常,由全局异常处理器进行处理。
转载请注明:http://www.xujin.org
posted on 2015-05-31 16:41 Software_King 阅读(555) 评论(0) 编辑 收藏 举报