猿问

如何从 Laravel 中抛出的异常中获取 HTTP 状态代码?

我目前正在 App/Exceptions/Handler.php 中集成一些逻辑。我希望能够访问 $exception 变量上的 HTTP 状态代码:


public function report(Throwable $exception)

{

    dd($exception->statusCode);

    parent::report($exception);

}

但是我收到以下错误:


ErrorException 未定义属性:ErrorException::$statusCode


当dd($exception)我得到以下信息时:


Symfony\Component\HttpKernel\Exception\NotFoundHttpException {#1214 ▼

  -statusCode: 404

  -headers: []

  #message: ""

  #code: 0

  #file: "C:\Users\CEX\Documents\GitHub\unified\vendor\laravel\framework\src\Illuminate\Routing\AbstractRouteCollection.php"

  #line: 43

  trace: {▶}

}

我如何访问statusCode?


喵喵时光机
浏览 192回答 3
3回答

慕无忌1623718

如果你查看源代码,Symfony\Component\HttpKernel\Exception\NotFoundHttpException你会发现它扩展了,Symfony\Component\HttpKernel\Exception\HttpException如果你查看类的声明,你会发现它$statusCode是私有的,但它有一个 getter 方法class HttpException extends \RuntimeException implements HttpExceptionInterface{    private $statusCode;    private $headers;    public function __construct(int $statusCode, string $message = null, \Throwable $previous = null, array $headers = [], ?int $code = 0)    {        $this->statusCode = $statusCode;        $this->headers = $headers;        parent::__construct($message, $code, $previous);    }    public function getStatusCode()    {        return $this->statusCode;    }    //...}因此,您只需要$exception->getStatusCode()检索状态代码(在您的情况下为 404),尽管您应该进行检查以确保您的 throwable 实现了,因为情况可能HttpExceptionInterface并不总是如此,因此该方法将不存在,您会得到致命错误if ($exception instanceof \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface) {  $code = $exception->getStatusCode();}

慕的地8271018

我的做法如下,由于这个问题相对较新,我推测您正在起诉Laravel版本7或8。根据 的文档Error Handling,正确的页面渲染方法现在如下public function render($request, Throwable $exception){    if ($exception instanceof CustomException) {    return response()->view('errors.custom', [], 500);    }    return parent::render($request, $exception);}为了使用自定义错误视图,您必须告诉您抛出的实例Laravel类型。要覆盖内部错误处理,您需要捕获作为 HTTP 异常抛出的异常。对于这些版本,正确的类是. 所以,Exception$exceptionSymfony\Component\HttpKernel\Exception\use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;在你的顶部引入处理类app\Exceptions\Handler.php根据您的场景将默认的 render() 方法修改为如下所示,use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;    //    //public function render($request, Throwable $exception){    // return parent::render($request, $exception);    if ($exception instanceof HttpExceptionInterface) {        if (env('APP_ENV') === 'production' && $exception->getStatusCode() == 404) {            return response()->view('errors.404', [], 404);        }        if (env('APP_ENV') === 'production' && $exception->getStatusCode() == 500) {            return response()->view('errors.500', [], 500);        }    }    return parent::render($request, $exception);}

HUH函数

尝试$exception->getCode()
随时随地看视频慕课网APP
我要回答