,"message":"...","data":null} * 说明:业务失败一律 HTTP 200 + code!=0(前端 request.js 只在 code===0/200 时视为成功), * 否则前端会把 500 显示成「网络异常(500)」,真实原因被吞掉。 * 仅 401/403/404 等 HTTP 语义异常保留原始状态码。 */ class ExceptionHandle extends Handle { public function render(Exception $e) { // ok()/fail() 抛出的 HttpResponseException 由框架直接输出,不走这里 if ($e instanceof \think\exception\HttpResponseException) { return parent::render($e); } $status = 200; $code = 500; $message = '服务器开小差了,请稍后再试'; if ($e instanceof \think\exception\ValidateException) { $code = 1; $message = $e->getError(); } elseif ($e instanceof \think\exception\HttpException) { $status = $e->getStatusCode(); $code = $status; $message = $e->getMessage() ?: '请求异常'; } // 详细信息只写日志,不回传给客户端(避免泄露路径/SQL) Log::record( 'API异常:' . get_class($e) . ' ' . $e->getMessage() . "\n" . $e->getTraceAsString(), 'error' ); if (\think\Config::get('app_debug')) { $message .= ' [' . $e->getMessage() . ' @ ' . basename($e->getFile()) . ':' . $e->getLine() . ']'; } return json([ 'code' => $code, 'message' => $message, 'data' => null, ], $status); } }