2017-05-30 10 views
1

データベース接続の問題からスローされた例外がグローバルに処理されるようにしようとしています。ルーメン:例外ハンドラ - QueryExceptionまたはPDOExceptionをキャッチしない

私はrender()メソッドは、しかし、例外のいずれも巻き込まないされている中Handler.php \私のアプリの\例外で次のように追加しました:これはまた私のapp.phpに追加された

<?php 

namespace App\Exceptions; 

use Exception; 
use Illuminate\Database\QueryException; 
use Illuminate\Validation\ValidationException; 
use Illuminate\Auth\Access\AuthorizationException; 
use Illuminate\Database\Eloquent\ModelNotFoundException; 
use Symfony\Component\HttpKernel\Exception\HttpException; 
use Laravel\Lumen\Exceptions\Handler as ExceptionHandler; 
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use PDOException; 

class Handler extends ExceptionHandler 
{ 
    /** 
    * A list of the exception types that should not be reported. 
    * 
    * @var array 
    */ 
    protected $dontReport = [ 
     AuthorizationException::class, 
     HttpException::class, 
     ModelNotFoundException::class, 
     ValidationException::class, 
    ]; 

    /** 
    * 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) 
    { 
     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) 
    { 
     if ($e instanceof AuthorizationException) { 
      return response()->json((['status' => 403, 'message' => 'Insufficient privileges to perform this action']), 403); 
     } 

     if ($e instanceof MethodNotAllowedHttpException) { 
      return response()->json((['status' => 405, 'message' => 'Method Not Allowed']), 405); 
     } 

     if ($e instanceof NotFoundHttpException) { 
      return response()->json((['status' => 404, 'message' => 'The requested resource was not found']), 404); 
     } 

     if ($e instanceof QueryException) { 
      return response()->json((['id' => 0, 'status_billing' => 'The requested resource was not found']), 500); 
     } 

     if ($e instanceof PDOException) { 
      return response()->json((['id' => 0, 'status_billing' => 'The requested resource was not found']), 500); 
     } 


     return parent::render($request, $e); 
    } 
} 

$app->singleton(App\Exceptions\Handler::class); 

私の人生のために、私はこれをうまく動作させることができません。

すべてのヘルプ/アドバイスが大幅に

おかげ

答えて

1

変更あなたのapp.php

$app->singleton(App\Exceptions\Handler::class); 

から以下の行をいただければ幸いです。

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class, 
    App\Exceptions\Handler::class 
); 

EDIT

上記の例外ハンドラバインディングでインターフェイスが必要な理由は、Routeの処理中に例外がスローされると、その例外を処理するために、以下の関数が呼び出されます。

protected function handleException($passable, Exception $e) 
    { 
     if (! $this->container->bound(ExceptionHandler::class) || ! $passable instanceof Request) { 
      throw $e; 
     } 

     $handler = $this->container->make(ExceptionHandler::class); 

     $handler->report($e); 

     return $handler->render($passable, $e); 
    } 

if条件は、コンテナにExceptionHandlerクラスのバインディングがあるかどうかをチェックします。バインディングがある場合、例外はその例外ハンドラクラスに渡され、さらに処理されます。宣言されたバインディングがない場合、例外が再スローされます。ここでバインディングはIlluminate\Contracts\Debug\ExceptionHandlerでチェックされます。そのため、App\Exceptions\Handler::classを使用して直接バインドすると、例外ハンドラによって例外がキャッチされません。

+0

お返事ありがとうございます。 これを見る前に私はこれをやっていましたが、それはうまくいったのですが、なぜ私が最初からそれを持っていたのかはわかりません。 ほんの数分前に私はそれを元に戻すことにしました。 もう1つのことは、私は例外が既にメソッドにキャッチされている場合、あなたが確認することを望む、レンダリングは、それをキャッチしないだろうか? また、「Illuminate \ Contracts \ Debug \ ExceptionHandler :: class」が必要な理由を簡単にまとめてもらえますか? ありがとうございます。 – thorbon

+1

はい、例外がすでにこのメソッドで捕捉されている場合、レンダリングメソッドはそれを捕まえません。私は詳細な説明を含めるために私の答えを更新しました。 – ayip

+0

素晴らしいです、ありがとうございます。 他にも使用できるバインドはありますか? Illuminate \ Contracts \ Debug \ ExceptionHandler – thorbon

関連する問題