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,并添加 @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 ReturnData resultFormat(Integer code, T ex) {
ex.printStackTrace();
return ReturnData.build(code, ex.getMessage());
}
}
@ControllerAdvice:捕获全局异常
@ExceptionHandler :全局异常类别分类,明确指出Exception的类别,并作出处理,可以根据自己的项目定义不同的异常处理
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();
}
}
PS:需要项目源代码,请邮件[email protected]联系