404需通过路由层机制捕获而非异常处理器:Spring Boot需配置spring.mvc.throw-exception-if-no-handler-found=true并禁用静态资源映射,用@ExceptionHandler(NoHandlerFoundException.class)处理;ThinkPHP需在route/app.php末尾用Route::miss()定义JSON响应;两者均须统一响应结构、状态码与字段。

404 不是异常,而是路由未匹配的结果,所以常规的 @ExceptionHandler 或 render() 无法捕获它——这是绝大多数人踩坑的根源。
Spring Boot 中正确捕获 404 并返回 JSON
必须启用 Spring MVC 的“找不到处理器时抛异常”机制,否则 404 会直接走静态错误页或默认白页,根本进不了全局异常处理器。
- 在
application.properties中开启强制抛出异常:
spring.mvc.throw-exception-if-no-handler-found=true - 禁用静态资源映射干扰(避免 404 被资源处理器提前拦截):
spring.resources.add-mappings=false - 定义一个专门处理
NoHandlerFoundException的方法:
@ExceptionHandler(NoHandlerFoundException.class)<br>public ResponseEntity<R<Void>> handle404(NoHandlerFoundException e) {<br> return ResponseEntity.status(HttpStatus.NOT_FOUND)<br> .body(R.error(404, "请求路径不存在"));}
ThinkPHP 中 404 的唯一可靠入口是 Route::miss()
TP8 的 404 完全不经过异常流程,HttpException(404) 会被中间件截断。必须在所有路由注册之后、route/app.php 底部添加:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Route::miss(function () {<br> return response()->json(['code' => 404, 'msg' => 'Not Found'], 404);<br>});
注意:不能写在中间件或控制器里,也不能靠 try-catch 捕获——它不是 PHP 异常,是路由层的逻辑结果。
统一响应结构要覆盖 404 状态码
无论 Spring 还是 ThinkPHP,404 返回的 JSON 必须和其它错误保持字段一致(如 code、msg、timestamp),否则前端拦截器会解析失败。
- 推荐用枚举类管理状态码,例如:
ReturnCode.RC404或ExceptionEnum.NOT_FOUND - 确保
404响应体中code字段值为 404,且 HTTP 状态码也为 404(不能只改 body 不改 status) - 避免在 404 处理中打印堆栈或暴露路径信息,防止信息泄露
验证是否生效的简单方式
用 curl 或 Postman 直接请求一个不存在的 API 路径(如 /api/v1/xxx),观察响应:
- HTTP 状态码是否为 404
- 响应体是否为标准 JSON(非 HTML 页面、非空、含预期字段)
- 日志中是否出现你定义的 404 处理逻辑的 trace(而非默认 Tomcat/TP 错误页)

















