Lumen 5.6 Обработка ошибок (выдает исключение дважды)

Это мой код для обработки любой ошибки:

App \ Исключения \ Handler :: класс

public function render($request, Exception $e)
{

$fe = \Symfony\Component\Debug\Exception\FlattenException::create($e);

$statusCode = $fe->getStatusCode();
$code       = $fe->getCode();
$message    = $fe->getMessage();

$errorObj = new \App\LOHDomain\Entities\Error($code, $message);

return response()->json(['data' => null, 'error' => $errorObj], $statusCode);
}

когда я анализирую поддельный URL-адрес WSDL в SoapClient, он выдает два исключения

{"data":null,"error":{"code":"0","message":"SOAP-ERROR: Parsing WSDL: Couldn't load from 'asdsd' : failed to load external entity \"asdsd\"\n"}}
{"data":null,"error":{"code":"1","message":"SOAP-ERROR: Parsing WSDL: Couldn't load from 'asdsd' : failed to load external entity \"asdsd\"\n"}}

Таким образом, ответ JSON стал недействительным

Комментируя эти строки кода в поставщике, он выдает одно исключение:

Laravel \ Lumen \ Концерны \ RegistersExceptionHandlers trait

protected function registerErrorHandling()
{
error_reporting(-1);

set_error_handler(function ($level, $message, $file = '', $line = 0) {
if (error_reporting() & $level) {
throw new ErrorException($message, 0, $level, $file, $line);
}
});

set_exception_handler(function ($e) {
$this->handleUncaughtException($e);
});

//        register_shutdown_function(function () {
//            $this->handleShutdown();
//        });
}

Так в чем проблема? и как это решить без правки у производителя?

1

Решение

Решение состоит в том, чтобы очистить последнюю ошибку, потому что она сработала дважды.

  1. Исключение ошибки.
  2. Вторая функция выключения.

Итак, решение:

App \ Исключения \ Handler :: класс

public function render($request, Exception $e)
{

$fe = \Symfony\Component\Debug\Exception\FlattenException::create($e);

$statusCode = $fe->getStatusCode();
$code       = $fe->getCode();
$message    = $fe->getMessage();

$errorObj = new \App\Domain\Entities\ResponseEntites\Error($code, $message);

/**
* This line of code resolves the issue
*
* To reproduce the issue :
* 1) Comment this following line of code
* 2) Provide a fake WSDL URL to the SoapClient
*
* Recommendation: Remove this line if you aren't using the SoapClient
*/
error_clear_last();

return new \Illuminate\Http\JsonResponse(['data' => null, 'error' => $errorObj], $statusCode);
}

Это не лучшее решение (но это лучшее решение, которое я пробовал в моем случае).
Если у вас есть лучшее решение, пожалуйста, поделитесь им.

ссылки по теме:

  1. Фатальные исключения обрабатываются дважды
  2. Изменение кода
2

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

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

По вопросам рекламы [email protected]