目前开发的一个项目
开发一个新功能,总是感觉很吃力,
因为总是要处理各种协作方接口异常情况:
(a)502 服务器没有启动
(b)403 拒绝访问
(c)404 接口路径不对
(d)500 服务器内部错误
如果把这些错误信息一层层往上返回,会非常麻烦
在业务逻辑中参杂了这些与业务一点关系都没有的代码,看起来很累赘.
看下面的代码:
错误是一步步往上传递,每一个方法里面都在处理,感觉好累
最下面的代码片段是控制器里面的,
在其他控制器里面也会看到类似的代码
其实可以统一处理的
这些异常应该在一个地方统一捕获,统一处理.
而不是东处理一个,西处理一个,看起来很乱,容易造成冗余和重复,很难维护.
下面我就漏改了:
如何实现异常统一处理呢?
第一,遇到异常直接抛出,而不是马上处理;
第二,一个异常handler进行统一处理
handler 类:
- package com.chanjet.gov.handler;
- import com.chanjet.gov.bean.exception.MustBeDealedException;
- import com.chanjet.gov.util.Constant;
- import org.springframework.web.bind.annotation.ControllerAdvice;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- /**
- * Created by whuanghkl on 3/30/16.
- */
- //注意使用注解@ControllerAdvice作用域是全局Controller范围
- //可应用到所有@RequestMapping类或方法上的@ExceptionHandler、@InitBinder、@ModelAttribute,在这里是@ExceptionHandler
- @ControllerAdvice
- public class ExceptionHandlerAdvice {
- @ExceptionHandler(MustBeDealedException.class)
- // @RESPONSE_CONTENTTYPE_JSON_UTFStatus(HttpStatus.BAD_REQUEST)
- // @ResponseBody
- public String handleIOException(MustBeDealedException ex) {
- // return ClassUtils.getShortName(ex.getClass()) + ex.getMessage();
- System.out.println(ex);
- HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
- String responseStatusCode = ex.getResponseStatusCode();
- if (null == responseStatusCode) {
- responseStatusCode = Constant.EMPTY;
- }
- try {
- response.sendRedirect("/error.html?error=" + ex.getErrorCode() + "&responseStatusCode=" + responseStatusCode);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
参考:http://www.cnblogs.com/xguo/p/3163519.html