SpringBoot实现全局异常处理在项目开发中出现异常的时候是很常见的。我们也有很多处理异常的方法,可能如下:publicintdiv(inta,intb){intc=0;试试{c=a/b;}catch(Exceptionex){ex.printStackTrace();}返回c;如果我们这样处理异常,那么代码中就会有很多异常处理模块,那么代码就会变得可读性很差,业务模块逻辑会和很多非业务逻辑混在一起。但是在项目开发的过程中,我们应该以业务模块为中心,除了必要的异常处理模块之外,最好不要包含其他不相关的代码。那么我们如何处理项目中无处不在的异常呢?这就引出了我们要介绍的全局异常处理方法。主要有两种方式:HandlerExceptionResolver。@ControllerAdvice+@ExceptionHandler今天主要介绍@ControllerAdvice+@ExceptionHandler处理全局异常的方式。全局异常处理首先介绍一下@ControllerAdvice和@ExceptionHandler@ControllerAdvice注解:它是一个特殊的@Component,用于定义作用于所有@Controller类型接口的全局异常处理类。@ExceptionHandler注解:用于声明处理异常的方法。配置全局异常@ControllerAdvice+@ExceptionHandler只要设计得当即可,不需要在Controller中使用trg-catch!我们先来编写介绍一个Controller层的全局异常处理类。@ControllerAdvicepublicclassGlobalExceptionHandler{@ResponseBody@ExceptionHandler(Exception.class)publicCommonResultexceptionHandler(HttpServletRequestrequest,Exception异常)throwsException{Mapresult=newHashMap<>(3);Stringagepmessage=)+request.getRequestURL().toString();返回CommonResult.failed(消息);}}注:@ResponseBody的作用其实就是将java对象转换成json格式的数据。至此,一个简单的全局异常处理方案就完成了。这只是一种简单的异常处理方式,远没有达到完整项目中的全局异常处理方案。全局异常处理的升级在我们项目的业务处理中,我们可以通过自定义异常知道是哪个模块发生了异常,不同的业务模块也有不同的异常处理方式,也方便我们扩展publicclassServiceExceptionextendsRuntimeException{私有IErrorCode错误代码;publicServiceException(IErrorCodeerrorCode){super(errorCode.getMessage());this.errorCode=errorCode;}publicServiceException(Stringmessage){super(message);}publicServiceException(Throwablecause){super(cause);}publicServiceException(Stringmessage,Throwablecause){super(message,cause);}publicIErrorCodegetErrorCode(){返回错误代码;}}添加自定义异常处理@ControllerAdvicepublicclassGlobalExceptionHandler{/***处理所有服务层异常*/@ResponseBody@ExceptionHandler(value=ServiceException.class)publicCommonResulthandle(ServiceExceptione){if(e.getErrorCode()!=null){返回CommonResult.failed(e.getErrorCode());}返回CommonResult.failed(e.getMessage());}/***处理所有不可知的异常*/@ResponseBody@ExceptionHandler(Exception.class)publicCommonResultexceptionHandler(HttpServletRequestrequest,Exceptionexception)throwsException{Mapresult=newHashMap<>(3);Stringmessage=exception.getMessage()+request.getRequestURL().toString();返回CommonResult.failed(消息);}}ProcessController数据绑定和数据校验异常在用户注解登录Model字段上的数据校验规则@Data@EqualsAndHashCode(callSuper=false)publicclassUserLoginParam{@NotEmptyprivateStringusername;@NotEmptyprivateStringpassword;}SpringBoot可以使用@Validated+@RequestBody注解实现数据绑定和数据校验。例如登录方法为:@ApiOperation(value="登录后返回token")@RequestMapping(value="/login",method=RequestMethod.POST)@ResponseBodypublicCommonResultlogin(@Validated@RequestBodyUmsAdminLoginParamumsAdminLoginParam){Stringtoken=adminService.login(umsAdminLoginParam.getUsername(),umsAdminLoginParam.getPassword());if(token==null){returnCommonResult.validateFailed("用户名或密码错误");}MaptokenMap=newHashMap<>();tokenMap.put("令牌",令牌);tokenMap.put("tokenHead",tokenHead);返回CommonResult.success(tokenMap);如果数据校验不正确,抛出的异常是MethodArgumentNotValidException,那么我们可以在全局异常处理类中添加一条MethodArgumentNotValidException异常的处理语句,即可实现全局处理数据校验和绑定异常,如下:@ResponseBody@ExceptionHandler(value=MethodArgumentNotValidException.class)publicCommonResulthandleValidException(MethodArgumentNotValidExceptione){BindingResult绑定结果=e.getBindingResult();字符串消息=空;如果(bindingResult.hasErrors()){FieldErrorfieldError=bindingResult.getFieldError();if(fieldError!=null){message=fieldError.getField()+fieldError.getDefaultMessage();}}返回CommonResult.validateFailed(消息);}通过上面介绍的未知异常、数据校验和自定义全局异常,所有Controller层的异常处理方法都集中在了GlobalExceptionHandler类中,那么我们就可以不用再接收日志错误了GlobalExceptionHandler全部代码@ControllerAdvicepublicclassGlobalExceptionHandler{@ResponseBody@ExceptionHandler(value=ApiException.class)publicCommonResulthandle(ApiExceptione){if(e.getErrorCode()!=null){returnCommonResult.failed(e.getErrorCode());}返回CommonResult.failed(e.getMessage());}@ResponseBody@ExceptionHandler(Exception.class)publicCommonResultexceptionHandler(HttpServletRequestrequest,Exception异常)throwsException{Mapresult=newHashMap<>(3);Stringmessage=exception.getMessage()+request.getRequestURL().toString();返回CommonResult.failed(消息);//返回结果;}@ResponseBody@ExceptionHandler(value=MethodArgumentNotValidException.class)publicCommonResulthandleValidException(MethodArgumentNotValidExceptione){BindingResultbindingResult=e.getBindingResul吨();字符串消息=空;如果(bindingResult.hasErrors()){FieldErrorfieldError=bindingResult.getFieldError();if(fieldError!=null){message=fieldError.getField()+fieldError.getDefaultMessage();}}返回CommonResult.validateFailed(消息);}}总结今天我们主要讲解了@ControllerAdvice+@ExceptionHandler在Controller层统一全局异常处理