我正在尝试找到一种无法找到路径时自定义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吗?
答案 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来实现你想要的。