Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

Boot Web 应用怎样统一异常响应?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

通常通过ControllerAdvice或RestControllerAdvice中的ExceptionHandler,按异常类型返回适当状态与稳定错误结构;参数绑定和验证失败也要覆盖。Boot提供相关默认错误处理,但不会替你定义所有业务错误含义。过滤器与异步任务的异常还存在各自边界。

讲清原理

可将可预期的输入错误与未知故障分开,错误响应保留可公开的代码和说明,内部日志关联根因。不要把所有异常都转成HTTP200,也不要把数据库错误简单包装成“数据不存在”。

MVC对象验证和方法级验证可有不同异常类型,安全过滤链拒绝也不保证进入同一Advice。统一格式需要围绕实际入口测试,而不是只给一个Exception加最宽泛的处理方法。

例子与易错点

示例可以让无效参数得到400、未知故障得到适当服务端错误,并确认正文不含堆栈或密钥。错误码契约与日志关联应稳定,不能让前端靠解析异常类名决定业务行为。

以下为 Java 21 类成员示例,放入同一外部类中使用,依赖 Boot4.1.2 / Framework7.0.10。MockMvc验证MVC异常边界,不证明其他过滤链或服务器错误也进入Advice。

@org.springframework.web.bind.annotation.RestController
static class Endpoint {
    @org.springframework.web.bind.annotation.GetMapping("/input")
    String read() { throw new IllegalArgumentException("private-internal-detail"); }
}
@org.springframework.web.bind.annotation.RestControllerAdvice
static class Errors {
    @org.springframework.web.bind.annotation.ExceptionHandler(IllegalArgumentException.class)
    org.springframework.http.ResponseEntity<String> invalid() {
        return org.springframework.http.ResponseEntity.badRequest().body("invalid-input");
    }
}

相关题:第 16 题、第 29 题、第 38 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。