SpringBoot 为API添加统一的异常处理

Posted rinack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 为API添加统一的异常处理相关的知识,希望对你有一定的参考价值。

首先我把异常分为两种,一种是可控制的,或者是由我们发现条件不正确主动抛出的异常,就像前城市编号不存在那个粟子;另一种是不可控制的,或者说是程序存在bug引起的异常,但这种异常也不想变态的就直接给前端抛出个500异常。

实现步骤如下:

第1步,新建一个Exception类

新建一个RESTException类,在主动招聘异常时,就抛出一个RESTException类实例。它包含两个属性,code和message。code是要抛出的异常代码用http状态码来表示,message是想要告诉前端的信息,如“城市编号不存在”之类的。

/**
 * Name:RESTException
 * Description: 异常信息
 */
public class DescribeException extends Exception 
int code;//状态代码 String message;//异常提示信息 public int getCode() return code; public void setCode(int code) this.code = code; @Override public String getMessage() return message; public void setMessage(String message) this.message = message;

第2步,建一个异常拼接器

创建一个异常处理器,它有两个异常处理方法,一个处理主动抛出的异常,一个处理非主动异常。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/**
 * Name:APIExceptionHandler
 * Description:
 */
@ControllerAdvice
public class APIExceptionHandler 
Logger logger
= LoggerFactory.getLogger(this.getClass()); /** * 处理业务发现问题主动抛出的异常 * @param request * @param e * @return * @throws Exception */ @ExceptionHandler(value = DescribeException.class) @ResponseBody public ResponseEntity<DescribeException> baseErrorHandler(HttpServletRequest request, DescribeException e) throws Exception //把错误输出到日志 logger.error("DescribeException Handler---Host: invokes url: ERROR: ", request.getRemoteHost(), request.getRequestURL(), e.getMessage()); return new ResponseEntity<DescribeException>(e, HttpStatus.valueOf(e.getCode())); /** * 系统抛出的没有处理过的异常 * @param request * @param e * @return * @throws Exception */ @ExceptionHandler(value = Exception.class) @ResponseBody public ResponseEntity<Exception> defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception //把错误输出到日志 logger.error("DefaultException Handler---Host: invokes url: ERROR: ", request.getRemoteHost(), request.getRequestURL(), e.getMessage()); return new ResponseEntity<Exception>(new Exception("Soory, 服务器好像抽风了, 程序员小伙伴正在疯狂抢救!"), HttpStatus.INTERNAL_SERVER_ERROR);

主异常处理方法将传递业务处理中的异常提示信息给前端,非主动异常处理方法将统一返回一种异常提示信息到前端。

第3步,在业务中抛出自定义异常

thow new DescribeException(HttpStatus.INTERNAL_SERVER_ERROR.value(),"自定义错误信息");

 

以上是关于SpringBoot 为API添加统一的异常处理的主要内容,如果未能解决你的问题,请参考以下文章

spring 或 springboot统一异常处理

SpringBoot | 第八章:统一异常数据校验处理

SpringBoot 逻辑异常统一处理

springboot统一异常处理

spring boot 1.5.4 统一异常处理

Spring Boot2 系列教程 (十四) | 统一异常处理