项目在运行时出现异常时,如若没有对异常进行捕获并处理,就会出现如下页面:

创新互联建站是一家集网站建设,洪江企业网站建设,洪江品牌网站建设,网站定制,洪江网站建设报价,网络营销,网络优化,洪江网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
这样显然对用户是极其不友好的。
后端不应该直接返回错误页面,而应返回统一的错误信息,比如:
- {
 - "code": 500,
 - "data": null,
 - "message": "服务异常,请稍后重试"
 - }
 - 复制代码
 
然后,前端根据返回的信息,显示友好的提示页面。
Spring提供了三种方式对异常统一处理:
下面我们来实际操作下。
在【统一基类、接口、返回对象设计】这一篇文章中, 定义了Controller的基类BaseController,所以只要在BaseController中使用@ExceptionHandler处理异常, 其它Controller继承BaseController即可。实现如下:
- @Slf4j
 - public abstract class BaseController {
 - /**
 - * BusinessException 异常处理
 - */
 - @ResponseBody
 - @ExceptionHandler(BusinessException.class)
 - public ApiResult businessExceptionHandler(BusinessException e) {
 - log.error(e.getMessage(), e);
 - // do something
 - return ApiResult.fail(e.getMessage());
 - }
 - /**
 - * Exception 异常处理
 - */
 - @ResponseBody
 - @ExceptionHandler(Exception.class)
 - public ApiResult exceptionHandler(Exception e) {
 - log.error(e.getMessage(), e);
 - return ApiResult.fail("服务异常,请稍后重试");
 - }
 - }
 - 复制代码
 
这里对异常BusinessException和Exception进行了处理, BusinessException是约定的业务异常的基类,若是主动抛出一般都要求是BusinessException的子类,都会被businessExceptionHandler处理。 若是其它异常,可能是意想不到的异常,则会被exceptionHandler处理。
统一处理后,返回结果如下:
- @Slf4j
 - @Component
 - public class GlobalHandlerExceptionResolver implements HandlerExceptionResolver {
 - @Override
 - public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
 - log.error(e.getMessage(), e);
 - ApiResult apiResult;
 - if (e instanceof BusinessException) {
 - BusinessException be = (BusinessException) e;
 - // do something
 - apiResult = ApiResult.fail(be.getMessage());
 - } else {
 - apiResult = ApiResult.fail("服务异常,请稍后重试");
 - }
 - WebUtils.writeJson(response, apiResult);
 - return null;
 - }
 - }
 - 复制代码
 
该方式需要实现HandlerExceptionResolver接口,然后将实现类注入到Spring容器中。
但第一种方式中,通过@ResponseBody注解,Spring就帮我们返回了json格式数据,而这需要自己实现。
这里实现了工具类WebUtils,用于返回json数据,如下:
- public class WebUtils {
 - private static final Logger log = LoggerFactory.getLogger(WebUtils.class);
 - private static Gson gson = new GsonBuilder().serializeNulls().create();
 - /**
 - * 返回json数据
 - *
 - * @param response
 - * @param object
 - */
 - public static void writeJson(HttpServletResponse response, int status, Object object) {
 - response.setHeader("Content-Type", "application/json;charset=UTF-8");
 - response.setContentType("application/json;charset=UTF-8");
 - response.setStatus(status);
 - PrintWriter out = null;
 - try {
 - String data = object instanceof String ? (String) object : gson.toJson(object);
 - out = response.getWriter();
 - out.print(data);
 - out.flush();
 - } catch (Exception e) {
 - log.error(e.getMessage(), e);
 - } finally {
 - if (out != null) {
 - out.close();
 - }
 - }
 - }
 - /**
 - * 返回json数据
 - *
 - * @param response
 - * @param object
 - */
 - public static void writeJson(HttpServletResponse response, Object object) {
 - writeJson(response, HttpServletResponse.SC_OK, object);
 - }
 - /**
 - * 返回json数据
 - *
 - * @param response
 - * @param object
 - */
 - public static void writeJson(ServletResponse response, Object object) {
 - if (response instanceof HttpServletResponse) {
 - writeJson((HttpServletResponse) response, object);
 - }
 - }
 - }
 - 复制代码
 
工具类中使用了Gson,需要引用:
com.google.code.gson gson - 复制代码
 
该方式与第一种方式类似,如下:
- @Slf4j
 - @ControllerAdvice
 - public class GlobalExceptionHandler {
 - /**
 - * BusinessException 异常处理
 - */
 - @ResponseBody
 - @ExceptionHandler(BusinessException.class)
 - public ApiResult businessExceptionHandler(BusinessException e) {
 - log.error(e.getMessage(), e);
 - // do something
 - return ApiResult.fail(e.getMessage());
 - }
 - /**
 - * Exception 异常处理
 - */
 - @ResponseBody
 - @ExceptionHandler(Exception.class)
 - public ApiResult exceptionHandler(Exception e) {
 - log.error(e.getMessage(), e);
 - return ApiResult.fail("服务异常,请稍后重试");
 - }
 - }
 - 复制代码
 
三种方式都能很好对异常进行统一处理,但是一般推荐使用@ControllerAdvice + @ExceptionHandler方式, 这样能够使异常处理与业务逻辑分离,并且不用自己处理Json数据返回。
github.com/zhuqianchan…
                文章题目:从零搭建后端框架——异常统一处理的三种方式
                
                文章出自:http://www.csdahua.cn/qtweb/news13/69013.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网