Laravel 9中判断异常是否可报告及API自定义错误响应
Laravel 9 API自定义错误响应实现
要实现关闭调试模式后,给内部服务器错误添加code字段,同时隐藏敏感异常信息,你可以通过Laravel异常处理器的renderable回调,结合环境配置和异常类型判断来实现:
具体实现代码
修改app/Exceptions/Handler.php中的register方法:
public function register() { $this->reportable(function (Throwable $e) { // 保留默认的报告逻辑,或根据需求自定义 }); $this->renderable(function (Throwable $e) { // 仅在调试模式关闭时,隐藏内部异常详情 if (!config('app.debug')) { // 判断是否为HTTP状态异常(如404、403、422等) if ($this->isHttpException($e)) { $statusCode = $e->getStatusCode(); // 优先使用异常自带的消息,无消息则用HTTP状态码对应的默认文本 $message = $e->getMessage() ?: \Illuminate\Http\Response::$statusTexts[$statusCode]; return response()->json([ 'code' => $statusCode, 'message' => $message ], $statusCode); } // 非HTTP异常(如数据库错误、代码逻辑错误等),返回通用500响应 return response()->json([ 'code' => 500, 'message' => 'Server Error' ], 500); } // 调试模式开启时,返回详细异常信息(方便开发调试) return response()->json([ 'code' => $e->getCode() ?: 500, 'message' => $e->getMessage(), 'trace' => $e->getTraceAsString() ], $e->getCode() ?: 500); }); }
逻辑说明
- 环境判断:通过
config('app.debug')判断调试模式是否关闭,仅在生产环境(或调试关闭)时隐藏异常详情。 - HTTP异常识别:使用
$this->isHttpException($e)区分HTTP状态类异常(这类异常是用户可感知的,比如路由不存在、参数验证失败等),返回对应的状态码和友好消息。 - 内部异常处理:对于非HTTP异常(如数据库连接失败、代码语法错误等),统一返回
code=500的通用错误响应,避免暴露敏感的系统信息。 - 调试模式兼容:调试模式开启时,返回包含异常追踪的详细信息,方便开发定位问题。
扩展:自定义异常支持
如果有自己定义的业务异常类,希望展示具体的错误信息,可以在HTTP异常判断中加入自定义异常的判断:
if ($this->isHttpException($e) || $e instanceof \App\Exceptions\YourCustomException) { // 处理自定义异常的响应逻辑 $statusCode = method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 400; return response()->json([ 'code' => $e->getCode() ?: $statusCode, 'message' => $e->getMessage() ], $statusCode); }
内容的提问来源于stack exchange,提问作者Vüsal Hüseynli
相关产品推荐
相关产品推荐

