Lumen: обработчик исключений — не перехватывает исключения QueryException или PDOException

Я пытаюсь обеспечить глобальную обработку исключений, возникающих из-за проблем с подключением к базе данных.

Я добавил следующее в мой app \ Exceptions \ Handler.php в методе render (), однако ни одно из исключений не перехватывается:

<?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.php:

$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
);

РЕДАКТИРОВАТЬ

Причина, по которой интерфейс требуется в приведенной выше привязке обработчика исключений, заключается в том, что при возникновении исключения во время обработки маршрута вызывается следующая функция для обработки этого исключения.

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, исключение не перехвачено вашим обработчиком исключений.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector