如何在laravel中捕获NotFoundHttpException以发送自定义响应?

时间:2019-05-19 01:22:18

标签: laravel exception

我不明白为什么laravel不捕获NotFoundHttpException,但是却捕获所有其他异常。

我想根据异常类型向用户发送自定义json响应,这适用于除NotFoundHttpException以外的所有列出的异常:

from PIL import ImageGrab

pixelRGB = ImageGrab.grab().getpixel((x, y))

当我请求创建NotFoundHttpException时,laravel使用默认的switch case选项进行响应,对此有任何建议吗?

2 个答案:

答案 0 :(得分:2)

Laravel的异常处理程序决定如何处理引发异常,默认情况下将忽略ModelNotFoundException。

检查app / Exceptions / Handler.php中的文件,它将扩展Laravel框架中的异常处理程序。

在此处查看文档:{​​{3}}

答案 1 :(得分:0)

我找到了解决此问题的方法,但我仍然不完全了解它是如何工作的,但是它对我有用,请让我解释一下:

当我在.env文件中具有APP_DEBUG = true并在Handler类中使用默认呈现功能时,它抛出了'Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException'。

但是当我执行get_class($ exception)以确保它抛出相同的类时,由于某种原因,它正在抛出“ Illuminate \ Database \ Eloquent \ ModelNotFoundException”。因此,我只是更改了代码以捕获该异常:         命名空间App \ Exceptions;

use Exception;
use Illuminate\Database\QueryException;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{

    public function render($request, Exception $exception)
    {
        switch (true) {
            case $exception instanceof QueryException:
                return response()->json('QueryException')

            case $exception instanceof ModelNotFoundException:
                return response()->json('ModelNotFoundException')

            case $exception instanceof AuthenticationException:
                return response()->json('AuthenticationException')

            default:
                return response()->json('Different Exception')
        }

        //return parent::render($request, $exception); //This throws a ModelNotFoundException
    }
}

这解决了问题,但我仍然不明白为什么它会以默认方式引发不同的异常。

当我将get请求发送到localhost:8000 / api / users / $ id到不存在的用户ID时,这是引发异常的代码。

//UserController.php

public function show(User $user)
{
    return new UserResource($user);
}