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

时间:2017-08-18 13:01:03

标签: php laravel-5.4

我正在尝试找到一种无法找到路径时自定义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 个答案:

答案 0 :(得分: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来实现你想要的。