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 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。