全局异常处理,干掉try catch。"/>
springboot全局异常处理,干掉try catch。
写在前面
SpringBoot项目进行全局异常的处理是非常有必要的,不仅处理异常方便,而且可以优化代码,干掉try catch。本篇文章基于spring boot。
感谢.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;}@Overridepublic int getResultCode() {return resultCode;}@Overridepublic 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;}@Overridepublic String toString() {return JSONObject.toJSONString(this);}}
自定义全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {/*** 处理自定义的业务异常* @param req* @param e* @return*/@ExceptionHandler(value = BusinessException.class)@ResponseBodypublic 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)@ResponseBodypublic 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)@ResponseBodypublic 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 {@Overridepublic String getErrorPath() {// TODO Auto-generated method stubreturn "/error";}@RequestMapping("/error")public boolean handlerError() {throw new BusinessException(-1,"页面不存在");}}
测试
加入我们群
如果有需要,欢迎可以加入我们的QQ群!(QQ搜索 1074281704,加入我们的QQ群吧!)
有任何问题,也可以加入我们的QQ群,欢迎交(che)流(dan)!也欢迎参观我的博客www.aquestian!!
更多推荐
springboot全局异常处理,干掉try catch。
发布评论