SpringMVC @ExceptionHandler典型用法及说明

 更新时间:2026年04月16日 14:38:28   作者:张紫娃  
文章介绍了Spring中的异常处理机制,包括处理单个和多个异常类型的方法,返回结构化错误信息的推荐做法,以及处理所有异常的兜底方法,另外,还提到了@ExceptionHandler方法的多种返回类型

处理单个异常类型

当 getUser() 方法抛出 UserNotFoundException 时,会自动调用 handleUserNotFound() 方法进行处理。

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        // 可能抛出 UserNotFoundException
        return userService.getUserById(id);
    }

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

处理多个异常类型

一个 @ExceptionHandler 方法可以处理多个异常类型:

@ExceptionHandler({IllegalArgumentException.class, ResourceNotFoundException.class})
public ResponseEntity<String> handleClientErrors(RuntimeException ex) {
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("客户端错误: " + ex.getMessage());
}

结合 @ResponseStatus 使用(返回指定状态码)

此时返回值直接作为响应体,HTTP 状态码由 @ResponseStatus 指定。

@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleResourceNotFound(ResourceNotFoundException ex) {
    return ex.getMessage();
}

返回结构化错误信息(推荐做法)

@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleUserNotFound(UserNotFoundException ex) {
    ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage(), LocalDateTime.now());
    return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}

// ErrorResponse 示例类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ErrorResponse {
    private int status;
    private String message;
    private LocalDateTime timestamp;
}

捕获所有异常(兜底处理)

注意顺序:

更具体的异常应放在前面,避免被 Exception.class 拦截。

@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResponse handleAllExceptions(Exception ex) {
    return new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "系统内部错误", ex.getMessage(), LocalDateTime.now());
}

不同返回类型

@ExceptionHandler 方法可以有多种返回类型,如 String, ResponseEntity, Map, 自定义 DTO 等。

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        if (id == null || id <= 0) {
            throw new IllegalArgumentException("用户 ID 不合法");
        }
        // ...
    }

    @ExceptionHandler(IllegalArgumentException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String handleIllegalArgument(IllegalArgumentException ex) {
        return "参数错误:" + ex.getMessage();
    }

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleUserNotFound(UserNotFoundException ex) {
        ErrorResponse error = new ErrorResponse(404, ex.getMessage(), LocalDateTime.now());
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
    }

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ErrorResponse handleAllExceptions(Exception ex) {
        return new ErrorResponse(500, "系统错误", ex.getMessage(), LocalDateTime.now());
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot项目维护全局json数据代码实例

    Spring Boot项目维护全局json数据代码实例

    这篇文章主要介绍了Spring Boot项目维护全局json数据代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java实现UDP通信过程实例分析【服务器端与客户端】

    Java实现UDP通信过程实例分析【服务器端与客户端】

    这篇文章主要介绍了Java实现UDP通信过程,结合实例形式分析了java实现UDP服务器端与客户端相关操作技巧与注意事项,需要的朋友可以参考下
    2020-05-05
  • Java try catch finally异常处理组合详解

    Java try catch finally异常处理组合详解

    这篇文章主要介绍了Java try catch finally异常处理组合详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Spring+Http请求+HttpClient实现传参

    Spring+Http请求+HttpClient实现传参

    这篇文章主要介绍了Spring+Http请求+HttpClient实现传参,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • SpringBoot项目没有把依赖的jar包一起打包的问题解决

    SpringBoot项目没有把依赖的jar包一起打包的问题解决

    这篇文章主要介绍了SpringBoot项目没有把依赖的jar包一起打包的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java之while与do-while循环的用法详解

    Java之while与do-while循环的用法详解

    在上一篇文章中,给大家讲解了循环的概念,并重点给大家讲解了for循环的使用。但在Java中,除了for循环之外,还有while、do-while、foreach等循环形式。这篇文章给大家讲解while循环的使用
    2023-05-05
  • [Spring MVC]-详解SpringMVC的各种参数绑定方式

    [Spring MVC]-详解SpringMVC的各种参数绑定方式

    本篇文章主要介绍了SpringMVC的各种参数绑定方式 ,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • eclipse中maven插件安装教程

    eclipse中maven插件安装教程

    这篇文章主要为大家详细介绍了eclipse中maven插件安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Springboot实现视频上传及压缩功能

    Springboot实现视频上传及压缩功能

    这篇文章主要介绍了Springboot实现视频上传及压缩功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • java语言如何生成plist下载ipa文件

    java语言如何生成plist下载ipa文件

    这篇文章主要介绍了java语言如何生成plist下载ipa文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论