Не удается обработать исключение с помощью try / catch

#php #symfony #guzzle #goutte

#php #symfony #жрать #goutte

Вопрос:

Я использую Goutte (который использует Guzzle) для извлечения содержимого, и мой скрипт заканчивается с ошибкой, хотя я работаю в try / catch:

 Error: Client error: `GET http://example.com/C42C9CA3` resulted in a `403 Forbidden` response:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "htt (truncated...)
  

Это то, что у меня есть:

 use GoutteClient;
$HTTPconfig = [ "curl" => [
                  CURLOPT_TIMEOUT => 60,
                  CURLOPT_CONNECTTIMEOUT => 60,
                  CURLOPT_SSL_VERIFYPEER => false,
                ],
                ['http_errors' => false]
              ];
$HTTPclient = new GoutteClient;
$HTTPclient->setClient(new GuzzleHttpClient($HTTPconfig));
$HTTPclient->setHeader('user-agent', 'Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20121202 Firefox/20.0');

try {
  $crawler = $HTTPclient->request('GET', $url);
  $doc = $crawler->html();
} catch (Exception $e) {
  write($e->getMessage());
  continue;
}
  

Комментарии:

1. Значит, этот вывод поступает не из write($e->getMessage()); ?

2. @JonStirling Нет, я добавил try / catch позже, и это все равно заканчивается этой ошибкой.

3. И это определенно вызвано этим фрагментом кода? Я не вижу причин, по которым это приведет к сбою и просто остановит выполнение.

4. Да, точно, это странно, но именно это и происходит. http://shop.lenovo.com/us/en/itemdetails/06P4069/460/0E80436C80A748E6AA76791FC42C9CA3 это URL.

5. Не удается выполнить репликацию с использованием предоставленного кода и URL.

Ответ №1:

Попробуйте с:

   } catch (Exception $e) {
  

вместо:

   } catch (Exception $e) {
  

Редактировать:

Если вы используете PHP-7, вы можете попытаться перехватить Throwable всегда с косой чертой следующим образом:

   } catch (Throwable $e) {
  

Надеюсь, это поможет

Комментарии:

1. Да — особенно, если у вас есть namespace файл, с которым вы работаете. (Неясно из вашего примера.)

2. Только что попробовал, все то же самое! Один неверный URL может стать таким препятствием ах!

3. Да, я использую PHP7. Пробовал и это, безуспешно. 🙁 Не могу поверить, что я застрял здесь на целый день только из-за этого. Не следовало использовать Goutte.

Ответ №2:

Удалить ['http_errors' => false] опцию. Это true по умолчанию и приводит к исключению для кодов ответа 4xx / 5xx.

Комментарии:

1. Пробовал, все то же самое. 🙁