Как отловить ошибку 500 в контроллере с помощью Laravel - PullRequest
0 голосов
/ 25 октября 2018

Мне нужно подключиться к API, чтобы я написал функцию:

try {
    $res4 = $client3->post('https://api.example.co.uk/Book', [
        'headers' => [
            'Accept' => 'application/json',
            'Content-Type' => 'application/json',
            'Authorization' => 'Bearer ajhsdbjhasdbasdbasd',
        ],
        'json' => [
            'custFirstName' => $FirstName,
            'custLastName' => $Surname,
            'custPhone' => $Mobile,
            'custEmail' => $Email,
        ]
    ]);
} catch (GuzzleHttp\Exception\ClientException $e) {
    $response = $e->getResponse();
    $result = json_decode($response->getBody()->getContents());
    $item->update(['status' => 'Problems at step3']);
    Mail::raw('Problem at STEP 3', function ($message) use ($serial) {
        $message->from('asd.asd@gmail.com', 'asd.asd@gmail.com');
        $message->subject('We got a problem etc.');
        $message->to('john.smith@gmail.com');
    });
}

Как вы можете видеть, мне нужно вызвать API, но в случае, когда API не работает, я пишу функции перехвата.

Но теперь, когда API не работает и API возвращает '500 Internal Error', эта функция только что упала ...

Мой вопрос: почему catch не справляется с этим?

Как я могу обрабатывать ошибки - когда API не работает или неправильный запрос ... Почему catch {} не работает?

ОБНОВЛЕНИЕ: вот мой laravel.log

[2018-10-25 14:51:04] local.ERROR: GuzzleHttp\Exception\ServerException: Server error: `POST https://api.example.co.uk/Book` resulted in a `500 Internal Server Error` response:
{"message":"An error has occured. Please contact support."}
 in /home/public_html/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php:107
Stack trace:
#0 /home/public_html/vendor/guzzlehttp/guzzle/src/Middleware.php(65): GuzzleHttp\Exception\RequestException::create(Object(GuzzleHttp\Psr7\Request), Object(GuzzleHttp\Psr7\Response))
#1 /home/public_html/vendor/guzzlehttp/promises/src/Promise.php(203): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Response))

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Возникающее исключение является экземпляром ServerException, и блок catch пытается перехватить ClientException.

} catch (GuzzleHttp\Exception\ServerException $e) {
0 голосов
/ 26 октября 2018

в вашем файле app / exceptions / handler.php, обновите метод рендеринга, как этот.

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception) {
    if ($exception instanceof \GuzzleHttp\Exception\ClientException) {
        return your_response();
    }
    return parent::render($request, $exception);
}

Этот подход работал для меня.

0 голосов
/ 25 октября 2018

Проблема заключается в том, что здесь используются пространства имен, а не:

} catch (GuzzleHttp\Exception\ClientException $e) {

. Вы должны использовать:

} catch (\GuzzleHttp\Exception\ClientException $e) {

В противном случае PHP предполагает, что класс находится в текущем пространстве имен, поэтому на самом деле, когда выиспользовал GuzzleHttp\Exception\ClientException на самом деле вы, вероятно, использовали App\Http\Controllers\GuzzleHttp\Exception\ClientException, и такое исключение, очевидно, не будет выдано Guzzle.

...