统一异常处理

1.统一异常处理

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  阅读(548)  评论(0编辑  收藏  举报

导航