如何在Laravel 5中捕获exception/缺失页面?

在Laravel 5中, App::missingApp::error不可用,那么现在如何捕获exception和缺less的页面呢?

在文档中找不到关于此的任何信息。

在Laravel 5中,您可以通过编辑app/Exceptions/Handler.phprender方法来捕获exception。

如果您想要捕获缺less的页面(也称为NotFoundException ),则需要检查exception$e是否是Symfony\Component\HttpKernel\Exception\NotFoundHttpException一个实例。

 public function render($request, Exception $e) { if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) return response(view('error.404'), 404); return parent::render($request, $e); } 

使用上面的代码,我们检查$e是否是Symfony\Component\HttpKernel\Exception\NotFoundHttpException一个instanceof ,如果是,我们发送一个response , 视图文件error.404作为HTTP状态码404的内容 。

这可以用于任何exception。 因此,如果您的应用程序发送了App\Exceptions\MyOwnException ,那么请检查该实例。

 public function render($request, Exception $e) { if ($e instanceof \App\Exceptions\MyOwnException) return ''; // Do something if this exception is thrown here. if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) return response(view('error.404'), 404); return parent::render($request, $e); } 

从今天的提交(9db97c3)开始,您只需在/ resources / views / errors /文件夹中添加一个404.blade.php文件,它将自动查找并显示它。

由于提交30681dc和9acf685 missing()方法已被移动到Illuminate\Exception\Handler类。

所以,有一段时间,你可以这样做:

 app('exception')->missing(function($exception) { return Response::view('errors.missing', [], 404); }); 

…但是最近, 62ae860已经完成了一个重构。

现在,你可以做的是将以下内容添加到app/Http/Kernel.php

 // add this... use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Response; class Kernel extends HttpKernel { (...) public function handle($request) { try { return parent::handle($request); } // ... and this: catch (NotFoundHttpException $e) { return Response::view('errors.missing', [], 404); } catch (Exception $e) { throw $e; } } 

最后请记住,Laravel目前还处于重大的发展阶段,可能会再次发生变化。

Angular HTML5模式可能会导致一堆缺less的页面(用户书签几页,并尝试重新加载)。 如果您不能覆盖服务器设置来处理这个问题,那么您可能会考虑重写缺less页面行为。

您可以修改\ App \ Exceptions \ Handler渲染方法来推送200内容,而不是使用404代码推送404模板。

 /** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */ public function render($request, Exception $e) { if ($this->isHttpException($e) && $e->getStatusCode() == 404) { return response()->view('angular', []); } return parent::render($request, $e); } 

Laravel附带默认错误页面,您可以轻松地添加像这样的自定义错误页面

1 – 在视图 – >错误文件夹中创build错误视图
2 – 名称必须与404或403 500等HTTP错误相匹配

 `Route::get('/page/not/found',function($closure){ // second param is optional abort(404, 'Page Not found'); });` 

通过添加以下代码

 protected $dontReport = [ 'Symfony\Component\HttpKernel\Exception\HttpException' ]; 

 public function render($request, Exception $e) { return redirect('/'); //return parent::render($request, $e); } 

将适合我的工作

如果你想保持你的networkingpath文件中的处理程序,在你现有的路线之后:

 Route::any( '{all}', function ( $missingRoute) { // $missingRoute } )->where('all', '(.*)'); 

一种方法可以处理它,但不是最好的是转换到redirect。

 <?php namespace App\Exceptions; use Exception; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; class Handler extends ExceptionHandler { /** * A list of the exception types that should not be reported. * * @var array */ protected $dontReport = [ 'Symfony\Component\HttpKernel\Exception\HttpException' ]; /** * Report or log an exception. * * This is a great spot to send exceptions to Sentry, Bugsnag, etc. * * @param \Exception $e * @return void */ public function report(Exception $e) { return parent::report($e); } /** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */ public function render($request, Exception $e) { return redirect('/'); //return parent::render($request, $e); } }