Laravel 9中try-catch捕获错误的状态码及变量访问问题
问题1:PHP Error类型返回状态码0的原因
- PHP原生的
\Error类(包括调用不存在方法触发的Error、未定义变量触发的Error等)默认不会设置有效的错误码,调用$e->getCode()返回的是0,这是PHP底层错误的默认行为。 - 你当前的代码逻辑是:若异常类为
Error或ErrorException,则取$e->getCode()作为状态码,而这类错误的code值就是0,因此返回了不符合预期的0而非500。 - 对比
ModelNotFoundException:它是Laravel封装的HTTP异常类,自带getStatusCode()方法,会返回404这类标准HTTP状态码,所以能正常获取有效状态码。
问题2:无法在catch块访问
$jsonResponse的原因 - 变量未初始化:如果try块内的代码在执行到
$jsonResponse = ...赋值语句之前就抛出了异常,$jsonResponse变量根本不会被定义,自然无法在catch块中访问。比如调用不存在的NonexistingMethod时,异常在update方法调用前就触发,$jsonResponse从未被赋值。 - 作用域规则限制:
use关键字仅用于闭包(匿名函数)捕获外部变量,catch块不属于闭包,不能通过use引入变量。即便$jsonResponse已被初始化,只要异常在赋值之后抛出,你可以直接在catch块访问它,但前提是变量已经完成定义——若异常发生在赋值前,变量就不存在。
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

