spring中全局异常处理器

spring中全局异常处理器 全局异常处理器的原理Spring全局异常处理器基于AOP面向切面编程思想通过ControllerAdvice或RestControllerAdvice注解标记的类实现。当应用抛出异常时Spring MVC会优先调用这些类中匹配的异常处理方法标注ExceptionHandler替代默认的Servlet容器异常处理流程。核心机制包括异常类型匹配根据ExceptionHandler指定的异常类层级进行匹配支持精确匹配或父类捕获。响应生成方法返回值可直接转换为JSONRestControllerAdvice或视图ControllerAdvice。全局异常处理器的好处统一异常响应格式避免不同接口返回杂乱的错误信息例如标准化HTTP状态码和错误消息体。解耦业务逻辑将异常处理从业务代码中剥离减少重复的try-catch块。增强可维护性集中管理异常处理逻辑便于后续修改或扩展。解决的问题避免暴露敏感信息屏蔽底层异常细节如SQL异常返回用户友好的提示。处理未捕获异常兜底处理未被try-catch捕获的运行时异常防止500错误直接暴露。跨切面需求如记录日志、监控报警等可在异常处理器中统一实现。使用方法1. 定义全局异常处理类RestControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(Exception.class)publicResponseEntityErrorResponsehandleException(Exceptionex){ErrorResponseresponsenewErrorResponse(SERVER_ERROR,系统繁忙请稍后重试);returnResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);}ExceptionHandler(BusinessException.class)publicResponseEntityErrorResponsehandleBusinessException(BusinessExceptionex){ErrorResponseresponsenewErrorResponse(ex.getCode(),ex.getMessage());returnResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);}}2. 自定义错误响应体DataAllArgsConstructorpublicclassErrorResponse{privateStringcode;privateStringmessage;}3. 触发异常示例RestControllerpublicclassDemoController{GetMapping(/test)publicStringtest(){thrownewBusinessException(PARAM_INVALID,参数校验失败);}}关键注解说明ControllerAdvice拦截控制器层异常需配合ResponseBody返回JSON。RestControllerAdvice等效于ControllerAdviceResponseBody。ExceptionHandler指定处理的异常类型支持多异常类如ExceptionHandler({AException.class, BException.class})。高级配置优先级控制通过Order注解调整多个异常处理器的执行顺序。范围限定使用basePackages或annotations参数限制ControllerAdvice的作用范围例如ControllerAdvice(basePackagescom.example.api)全局异常处理器的作用全局异常处理器用于集中处理应用程序中抛出的异常避免在业务代码中重复编写异常处理逻辑。通过统一处理异常可以提高代码的可维护性并确保返回给客户端的错误信息格式一致。处理特定异常针对不同的异常类型可以编写不同的处理方法。例如处理自定义的业务异常和Spring框架的特定异常。ExceptionHandler(BusinessException.class)publicResponseEntityErrorResponsehandleBusinessException(BusinessExceptionex){ErrorResponseerrorResponsenewErrorResponse(ex.getCode(),ex.getMessage());returnnewResponseEntity(errorResponse,HttpStatus.BAD_REQUEST);}ExceptionHandler(MethodArgumentNotValidException.class)publicResponseEntityErrorResponsehandleValidationException(MethodArgumentNotValidExceptionex){StringerrorMessageex.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(, ));ErrorResponseerrorResponsenewErrorResponse(HttpStatus.BAD_REQUEST.value(),errorMessage);returnnewResponseEntity(errorResponse,HttpStatus.BAD_REQUEST);}日志记录在异常处理过程中记录日志便于后续排查问题。可以使用SLF4J或Log4j等日志框架。ExceptionHandler(Exception.class)publicResponseEntityErrorResponsehandleException(Exceptionex){log.error(An unexpected error occurred,ex);ErrorResponseerrorResponsenewErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(),An unexpected error occurred);returnnewResponseEntity(errorResponse,HttpStatus.INTERNAL_SERVER_ERROR);}最佳实践总结使用ControllerAdvice和ExceptionHandler集中处理异常。定义自定义异常类区分不同类型的业务异常。统一错误响应格式便于前端处理。针对特定异常编写专门的处理逻辑。记录异常日志便于问题排查。编写测试用例确保异常处理器按预期工作。