写在前面
SpringBoot项目进行全局异常的处理是非常有必要的,不仅处理异常方便,而且可以优化代码,干掉try catch。本篇文章基于spring boot。
感谢https://www.cnblogs.com/xuwujing/p/10933082.html
处理500异常
自定义基础接口类
public interface BaseErrorInfoInterface {
/** 错误码*/
int getResultCode();
/** 错误描述*/
String getResultMsg();
}
自定义枚举类
public enum CommonEnum implements BaseErrorInfoInterface {
// 数据操作错误定义
SUCCESS(200, "成功!"),
BODY_NOT_MATCH(400,"请求的数据格式不符!"),
SIGNATURE_NOT_MATCH(401,"请求的数字签名不匹配!"),
NOT_FOUND(404, "未找到该资源!"),
INTERNAL_SERVER_ERROR(500, "服务器内部错误!"),
SERVER_BUSY(503,"服务器正忙,请稍后再试!")
;
/** 错误码 */
private int resultCode;
/** 错误描述 */
private String resultMsg;
CommonEnum(int resultCode, String resultMsg) {
this.resultCode = resultCode;
this.resultMsg = resultMsg;
}
@Override
public int getResultCode() {
return resultCode;
}
@Override
public String getResultMsg() {
return resultMsg;
}
}
自定义异常类
public class BusinessException extends RuntimeException {
private static final long serialVersionUID = -4879677283847539655L;
private int errorCode;
private String errorMessage;
private String exceptionMessage;
private Exception exception;
public BusinessException(String errorMessage) {
super();
this.errorMessage = errorMessage;
}
public BusinessException(int errorCode, String errorMessage) {
super();
this.errorCode = errorCode;
this.errorMessage = errorMessage;
}
public BusinessException(int errorCode, String errorMessage, Exception exception) {
super();
this.errorCode = errorCode;
this.errorMessage = errorMessage;
this.exception = exception;
}
public BusinessException(String errorMessage, String exceptionMessage) {
super();
this.exceptionMessage = exceptionMessage;
this.errorMessage = errorMessage;
}
public String getExceptionMessage() {
return exceptionMessage;
}
public void setExceptionMessage(String exceptionMessage) {
this.exceptionMessage = exceptionMessage;
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public Exception getException() {
return exception;
}
public void setException(Exception exception) {
this.exception = exception;
}
public BusinessException(int errorCode, String errorMessage, String exceptionMessage) {
super();
this.errorCode = errorCode;
this.errorMessage = errorMessage;
this.exceptionMessage = exceptionMessage;
}
}
自定义数据格式
public class Result {
/**
* 响应代码
*/
private int code;
/**
* 响应消息
*/
private String message;
/**
* 响应结果
*/
private Object result;
public Result() {
}
public Result(BaseErrorInfoInterface errorInfo) {
this.code = errorInfo.getResultCode();
this.message = errorInfo.getResultMsg();
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
/**
* 成功
*
* @return
*/
public static Result success() {
return success(null);
}
/**
* 成功
* @param data
* @return
*/
public static Result success(Object data) {
Result rb = new Result();
rb.setCode(CommonEnum.SUCCESS.getResultCode());
rb.setMessage(CommonEnum.SUCCESS.getResultMsg());
rb.setResult(data);
return rb;
}
/**
* 失败
*/
public static Result error(BaseErrorInfoInterface errorInfo) {
Result rb = new Result();
rb.setCode(errorInfo.getResultCode());
rb.setMessage(errorInfo.getResultMsg());
rb.setResult(null);
return rb;
}
/**
* 失败
*/
public static Result error(int code, String message) {
Result rb = new Result();
rb.setCode(code);
rb.setMessage(message);
rb.setResult(null);
return rb;
}
/**
* 失败
*/
public static Result error(String message) {
Result rb = new Result();
rb.setCode(-1);
rb.setMessage(message);
rb.setResult(null);
return rb;
}
@Override
public String toString() {
return JSONObject.toJSONString(this);
}
}
自定义全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理自定义的业务异常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public Result bizExceptionHandler(HttpServletRequest req, BusinessException e){
System.err.println("未知异常!原因是:"+e.getErrorMessage());
return Result.error(e.getErrorCode(),e.getErrorMessage());
}
/**
* 处理空指针的异常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value =NullPointerException.class)
@ResponseBody
public Result exceptionHandler(HttpServletRequest req, NullPointerException e){
System.err.println("未知异常!原因是:"+e);
return Result.error(CommonEnum.BODY_NOT_MATCH);
}
/**
* 处理其他异常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value =Exception.class)
@ResponseBody
public Result exceptionHandler(HttpServletRequest req, Exception e){
System.err.println("未知异常!原因是:"+e);
return Result.error(CommonEnum.INTERNAL_SERVER_ERROR);
}
}
控制层controller
@RestController
@RequestMapping
public class LoginController {
@PostMapping("/hello")
public boolean insert(Integer i) {
System.out.println("开始...");
//如果姓名为空就手动抛出一个自定义的异常!
if(i==null){
throw new BusinessException(-1,"i不能为空!");
}
return true;
}
@PutMapping("/hello")
public boolean update() {
System.out.println("开始更新...");
//这里故意造成一个空指针的异常,并且不进行处理
String str=null;
str.equals("111");
return true;
}
@DeleteMapping("/hello")
public boolean delete() {
System.out.println("开始删除...");
//这里故意造成一个异常,并且不进行处理
Integer.parseInt("abc123");
return true;
}
}
测试
处理404
这里使用最有效的办法。
实现ErrorController
@RestController
public class ErrController implements ErrorController {
@Override
public String getErrorPath() {
// TODO Auto-generated method stub
return "/error";
}
@RequestMapping("/error")
public boolean handlerError() {
throw new BusinessException(-1,"页面不存在");
}
}
测试
加入我们群
如果有需要,欢迎可以加入我们的QQ群!(QQ搜索 1074281704,加入我们的QQ群吧!)
有任何问题,也可以加入我们的QQ群,欢迎交(che)流(dan)!也欢迎参观我的博客www.aquestian.cn!!