如何在SpringBoot应用中实现异常处理?

在Spring Boot应用中实现异常处理通常有以下几种方式:

1. Controller级别的异常处理:使用@ExceptionHandler

你可以使用@ExceptionHandler注解来处理特定Controller中的异常。这让你能定义如何处理在你的Controller方法中抛出的异常。这是一个处理同一Controller内多个处理方法可能抛出的相同异常的有效方式。

java 复制代码
@Controller
public class MyController {

    @ExceptionHandler(DataNotFoundException.class)
    public ResponseEntity<String> handleDataNotFound(DataNotFoundException exception) {
        return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND);
    }
}

这个例子中,如果在MyController中任何一个请求映射方法抛出DataNotFoundExceptionhandleDataNotFound方法就会被调用。

2. 全局异常处理:使用@ControllerAdvice

为了应用更全局的处理方式,你可以创建一个使用@ControllerAdvice注解的类。里面可以定义一个或多个使用@ExceptionHandler注解的方法,这些方法将应用于你的整个Spring应用程序。

java 复制代码
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(DataNotFoundException.class)
    public ResponseEntity<String> handleDataNotFound(DataNotFoundException exception) {
        return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND);
    }
    
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleAllUncaughtException(Exception exception) {
        // 确保日志记录下所有未捕获的异常
        return new ResponseEntity<>("Internal server error", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

GlobalExceptionHandler类中,所有的Controller都会应用@ExceptionHandler中定义的行为。

3. @ResponseStatus注解

你可以在自定义异常上使用@ResponseStatus注解,这样当该异常被抛出时,Spring会自动使用这个注解描述的状态码作为HTTP响应状态码。

java 复制代码
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Data not found")
public class DataNotFoundException extends RuntimeException {
    // ...
}

4. 实现ErrorController

你可以创建一个控制器来实现ErrorController接口,并定义@RequestMapping来处理/error路径,这是处理所有类型的错误的另一种方法。

java 复制代码
@Controller
public class CustomErrorController implements ErrorController {

    @RequestMapping("/error")
    public String handleError(HttpServletRequest request) {
        // 获取错误属性并显示自定义视图或返回信息
        return "error";
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}

通过继承ErrorController,你可以提供处理所有异常和错误的自定义逻辑。

5. ResponseEntityExceptionHandler

Spring提供了一个ResponseEntityExceptionHandler基类,你可以扩展它来定制自己的异常处理逻辑。这个类在@ControllerAdvice类中特别有用。

java 复制代码
@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(DataNotFoundException.class)
    protected ResponseEntity<Object> handleDataNotFound(
        DataNotFoundException exception, HttpHeaders headers, HttpStatus status, WebRequest request) {
        // 创建并返回适当的ResponseEntity对象
    }
}

总结

Spring Boot提供了若干种灵活的异常处理方法。在实现异常处理时,你可以根据具体需求选择最适合你应用场景的策略。通常情况下,组合使用@ControllerAdvice@ExceptionHandler对全局异常处理而且配置简单的情况下非常有用,而ErrorControllerResponseEntityExceptionHandler提供了更多的自定制灵活性。

相关推荐
程序员爱钓鱼2 分钟前
Python编程实战 · 基础入门篇 | Python程序的运行方式
后端·go
小蜗牛编程实录9 分钟前
一文搞懂分布式事务:从理论到实践方案
分布式·后端
小蜗牛编程实录10 分钟前
深入理解网络 IO:从基础模型到多路复用技术
后端
Ekreke10 分钟前
一次Nginx 403 的问题排查
后端
绝无仅有41 分钟前
面试真实经历某商银行大厂数据库MYSQL问题和答案总结(二)
后端·面试·github
绝无仅有43 分钟前
通过编写修复脚本修复 Docker 启动失败(二)
后端·面试·github
老K的Java兵器库1 小时前
并发集合踩坑现场:ConcurrentHashMap size() 阻塞、HashSet 并发 add 丢数据、Queue 伪共享
java·后端·spring
冷冷的菜哥1 小时前
go邮件发送——附件与图片显示
开发语言·后端·golang·邮件发送·smtp发送邮件
向葭奔赴♡1 小时前
Spring Boot 分模块:从数据库到前端接口
数据库·spring boot·后端
计算机毕业设计木哥1 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的爱心公益网站
java·开发语言·vue.js·spring boot·后端·课程设计