Home Articles

在Laravel 5.4的web.php文件中捕获NotFoundHttpException并抛出自定义异常

Asked
Viewed 93 times
0

我正试图找到一种方法来定制Laravel 5.4的错误处理时找不到路由 . 在我的web.php中有一个错误定义的路由(故意用于测试目的) . 我把它包装在try ... catch块中并抛出我自己的自定义异常RoutesException:

try {
    Route::get('terms_rop_labels/view', 'LRChildController@view');
}catch (NotFoundHttpException $ex) {
    throw new RoutesException('terms_rop_labels/view');
}

然后在app \ Exceptions \ Handler.php中我试图在测试视图中捕获异常:

if ($exception instanceof NotFoundHttpException) {
$parameters = [
'message'=> 'NotFoundHttpException'
];
return response()->view('errors.test', $parameters, 500);
}
if ($exception instanceof RoutesException) {
        $parameters = [
            'message'=> 'RoutesException'
        ];
        return response()->view('errors.test', $parameters, 500);
}

任何人都可以解释为什么处理程序捕获NotFoundHttpException而不是我的自定义RoutesException?

1 Answer

  • 1

    web.php中的路由不会引发NotFoundHttpException异常 . 您只是在web.php中注册路由,而不是解决它们 .

    web.php中的Route facade允许您静态访问Illuminate \ Routing \ Router类中的get方法(参见https://github.com/laravel/framework/blob/5.4/src/Illuminate/Routing/Router.php中的125 - 135行)

    /**
     * Register a new GET route with the router.
     *
     * @param  string  $uri
     * @param  \Closure|array|string|null  $action
     * @return \Illuminate\Routing\Route
     */
    public function get($uri, $action = null)
    {
        return $this->addRoute(['GET', 'HEAD'], $uri, $action);
    }
    

    (所以你只是在web.php文件中使用Router get方法向RouteCollection添加路由 . )

    如果查看后向跟踪,可以看到在您的情况下抛出NotFoundHttpException异常的位置 . 例如,如果要通过在web.php中注册而导航到尚未添加到路径集合的不存在路由,则会看到第179行上的RouteCollection类匹配方法抛出了NotFoundHttpException .

    在你的情况下,try / catch中没有捕获NotFoundHttpException,因为

    Route::get('terms_rop_labels/view', 'LRChildController@view');
    

    没有抛出NotFoundHttpException .

    也许你可以通过在app \ Exceptions \ Handler中捕获NotFoundHttpException来实现你想要的 .

Related