为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
喵喵时光机 2023-09-22 14:38:17
我目前正在 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?
查看完整描述

3 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

如果你查看源代码,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();

}


查看完整回答
反对 回复 2023-09-22
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

我的做法如下,
由于这个问题相对较新,我推测您正在起诉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\


  1. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
    在你的顶部引入处理类app\Exceptions\Handler.php

  2. 根据您的场景将默认的 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);

}


查看完整回答
反对 回复 2023-09-22
?
HUH函数

TA贡献1836条经验 获得超4个赞

尝试$exception->getCode()

查看完整回答
反对 回复 2023-09-22
  • 3 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信