SpringBoot(四):统一异常处理

Spring Boot系列
SpringBoot(一):Quick start
SpringBoot(二):多环境切换
SpringBoot(三):Respond封装

目录

一.简介
二.创建ExceptionHandlerAdvice
三.请求测试

一.简介

我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,那该如何减少程序异常对用户体验的影响呢?其实方法很简单,对异常进行捕获,然后给予相应的处理即可。但实现的方式却有好多种,例如

try {
    ...
} catch (Exception e) {
    doSomeThing();
}

像这种标准的 try-catch 是可以解决问题,但如果让你在每个接口实现里面都 try-catch 一下,我想你应该是不太愿意的。那么下面来介绍下 SpringBoot 为我们提供的处理方式。
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考:ControllerAdvice 文档

二.创建ExceptionController

创建 ExceptionController,并添加 @ControllerAdvice注解。
并捕获几种常见的异常作为案例分析

PS : ReturnData类,ResponseCode类请看前几篇博客
package com.citydata.exception;

import com.citydata.constant.ResponseCode;
import com.citydata.response.ReturnData;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author: yjgithub
 * @create: 2018-05-29
 * @desc:   异常处理
 **/
@ControllerAdvice
@ResponseBody
public class ExceptionController {

    private String NullPointerExceptionStr="空指针异常";
    private String ArrayIndexOutOfBoundsStr="数组越界异常";
    private String ClassCastExceptionStr="类型转换异常";
    private int ERROR_CODE = 400;

    private static final String logExceptionFormat = "Capture Exception By GlobalExceptionHandler: Code: %s Detail: %s";

    //空指针异常
    @ExceptionHandler(NullPointerException.class)
    public ReturnData nullPointerExceptionHandler(NullPointerException ex) {
        return resultFormat(ERROR_CODE, new Exception(NullPointerExceptionStr));
    }

    //类型转换异常
    @ExceptionHandler(ClassCastException.class)
    public ReturnData classCastExceptionHandler(ClassCastException ex) {
        return resultFormat(ERROR_CODE,  new Exception(ClassCastExceptionStr));
    }


    //数组越界异常
    @ExceptionHandler(ArrayIndexOutOfBoundsException.class)
    public ReturnData ArrayIndexOutOfBoundsException(ArrayIndexOutOfBoundsException ex) {
        return resultFormat(ERROR_CODE, new Exception(ArrayIndexOutOfBoundsStr));
    }

    //其他错误
    @ExceptionHandler({Exception.class})
    public ReturnData exception(Exception ex) {
        return resultFormat(ERROR_CODE, new Exception(ResponseCode.SYSTEMBUSY.getMsg()));
    }

    private <T extends Throwable> ReturnData resultFormat(Integer code, T ex) {
        ex.printStackTrace();
        return ReturnData.build(code, ex.getMessage());
    }
}

@ControllerAdvice:捕获全局异常
@ExceptionHandler :全局异常类别分类,明确指出Exception的类别,并作出处理,可以根据自己的项目定义不同的异常处理

三.请求测试

3.1 项目结构
这里写图片描述

3.2 在TestService中添加接口方法(exception())

package com.citydata.service;

import com.citydata.response.ReturnData;

/**
 *
 * Created by yjgithub on 2018/5/28.
 */
public interface TestService {
    public ReturnData test(String str);
    public ReturnData exception();
}

3.3 在TestImpl中实现exception()方法,并造成数据越界异常

package com.citydata.service.impl;

import com.citydata.constant.ResponseCode;
import com.citydata.response.ReturnData;
import com.citydata.service.TestService;
import org.springframework.stereotype.Service;

/**
 * Created by yjgithub on 2018/5/28.
 */
@Service
public class TestImpl implements TestService {
    @Override
    public ReturnData test(String str) {
        ReturnData rd = new ReturnData(ResponseCode.OPERATION_SUCCESS.getStatus(),ResponseCode.OPERATION_SUCCESS.getMsg(),str);
        return rd;
    }

    @Override
    public ReturnData exception() {
        int[] arr = {1,2,3};//元素只有3个
        System.out.println(arr[4]); //明显的数据越界异常
        ReturnData rd = new ReturnData(ResponseCode.OPERATION_SUCCESS.getStatus(),ResponseCode.OPERATION_SUCCESS.getMsg());
        return rd;
    }
}

3.4 编写TestController,调用该接口/test/exception

package com.citydata.controller;

import com.citydata.response.ReturnData;
import com.citydata.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by yjgithub on 2018/5/28.
 */
@RestController
@RequestMapping("test")
public class TestController {
    @Autowired
    TestImpl testService;

    @RequestMapping("/index")
    public ReturnData index(String Str) {
        return testService.test(Str);
    }

    @RequestMapping("/exception")
    public ReturnData exception() {
        return testService.exception();
    }
}

3.5 访问接口测试
这里写图片描述
成功的捕获异常

PS:需要项目源代码,请邮件[email protected]联系

猜你喜欢

转载自blog.csdn.net/yjgithub/article/details/80493149