如何在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中任何一个请求映射方法抛出DataNotFoundException,handleDataNotFound方法就会被调用。

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对全局异常处理而且配置简单的情况下非常有用,而ErrorController和ResponseEntityExceptionHandler提供了更多的自定制灵活性。

相关推荐
实名上网宋凯宣7 小时前
Django
后端·python·django
利威尔xu9 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF10 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
慢云智慧空间10 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu10 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
薛定谔的猫-菜鸟程序员11 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
云创智城-yuncitys11 小时前
YunParking 4.0:JDK 17 与 Spring Boot 3.2 的停车云升级
java·开发语言·spring boot
IT_陈寒12 小时前
SpringBoot多环境配置把我坑惨了,这个踩坑经验你最好看看
前端·人工智能·后端
码事漫谈13 小时前
DeepSeek 搞了个 "Super-agent",但不是超级智能
后端
吴凡wudianmei13 小时前
从 0 搭一个 AI Agent(四):SSE 跑通之后,三处“契约错配”与它们的修复边界
前端·后端·aigc