在程序中,我们往往需要对异常的级别做处理,做数据记录,或者发送邮件预警处理,接下来我们在springboot程序中,实现自定义的异常处理和全局异常处理。
首先是自定义异常,我们自定义一个类,定义你需要返回的 code 和 message,需要更多的处理信息可以自行追加
package com.hqk.bootdemo.util;
/**
* <p>自定义异常处理信息</p >
*
* @author hqk
* @version 1.0: MyException.java v0.1 2019/6/19 上午10:55 hqk Exp$
*/
public class MyException extends RuntimeException{
//异常状态码
private String code;
//异常信息
private String message;
public MyException(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
在springboot中,我们可以使用 @ControllerAdvice 或者 @RestControllerAdvice 注解来处理异常,前者需要加上 @ResponseBody 才能返回 json 数据
package com.hqk.bootdemo.util;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
/**
* <p>异常处理</p >
*
* @author hqk
* @version 1.0: AllControllerAdvice.java v0.1 2019/6/19 上午10:48 hqk Exp$
*/
@RestControllerAdvice
public class AllControllerAdvice {
/**
* 自定义异常处理
* @param e
* @return
*/
@ExceptionHandler(value = MyException.class)
public Map<String,Object> customexceptionHandler(MyException e){
Map<String,Object> map = new HashMap<String,Object>();
map.put("code",e.getCode());
map.put("msg",e.getMessage());
map.put("data",null);
//可以对异常进行日志记录,写入数据库 或者 发送邮件预警
// if(e.getCode().equals("110")){ 写入数据库 或者 发送邮件预警 }
// log.info("错误信息"+e.getMessage());
return map;
}
/**
* 全局异常处理
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public Map<String,Object> exceptionHandler(Exception e){
Map<String,Object> map = new HashMap<String,Object>();
map.put("code","01");
map.put("msg",e.getMessage());
map.put("data",null);
return map;
}
}
接下来,我们写个 controller 进行测试 自定义异常 和 全局异常
package com.hqk.bootdemo.controller;
import com.hqk.bootdemo.util.MyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* <p></p >
*
* @author hqk
* @version 1.0: HelloController.java v0.1 2019/6/18 下午3:54 hqk Exp$
*/
@RestController
@RequestMapping("/app/system")
public class HelloController {
@RequestMapping("version")
public Map<String, Object> getHello() {
Map<String, Object> map = new HashMap<>();
map.put("code", "00");
map.put("msg", "请求成功");
try {
//抛异常
System.out.println(1 / 0);
} catch (Exception e) {
//抛出自定义异常信息
throw new MyException("110", "这是个重大的bug,请马上处理");
}
return map;
}
@RequestMapping("hello")
public Map<String, Object> getHai() {
Map<String, Object> map = new HashMap<>();
map.put("code", "00");
map.put("msg", "请求成功");
System.out.println(1 / 0);
return map;
}
}
接下来我们打开浏览器进行测试,如图,分别打印自定义异常信息 和全局异常信息