За последние 24 часа нас посетил 22241 программист и 1164 робота. Сейчас ищут 355 программистов ...

Как сделать универсальный обработчик ошибок try catch?

Тема в разделе "PHP для новичков", создана пользователем Kardamon, 22 апр 2019.

Метки:
  1. Kardamon

    Kardamon Новичок

    С нами с:
    22 апр 2019
    Сообщения:
    4
    Симпатии:
    0
    добрый день!
    Пытаюсь построить приложение для работы с API яндекса по SOAP.
    Функционал работает, но сегодня стали вылазить предупреждения и ошибки из-за недоступности сервисов яндекса:
    Код (Text):
    1. Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity "https://soap.direct.yandex.ru/v5/general.xsd"
    2. Fatal error: SOAP-ERROR: Parsing Schema: can't import schema
    ошибка вызывается при инициализации клиента:
    PHP:
    1.  $client = new SoapClient($wsdl,$clientOptions);
    Поскольку я не могу проверить результат на каждую ошибку, можно ли сделать что-то вроде:
    PHP:
    1. try{
    2. $client = new SoapClient($wsdl,$clientOptions);
    3. } catch {
    4. //если возникает любая ошибка
    5. sleep(1);
    6. //try again
    7. $client = new SoapClient($wsdl,$clientOptions);
    8. }
    Я читал документацию по try catch - и везде в блоке catch нужно прописывать какое именно исключение нужно ловить и т.д. я не понимаю как это применить.
    Можно ли ловить любое исключение (т.е. любое прупреждение или ошибку) и совершать на них определенное действие?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Можно ловить \Exception или \Trowable, все классы исключений реализуют Trowable, большинство наследуется от Exception. И, как обычно, это подробно описано в доке
     
  3. Kardamon

    Kardamon Новичок

    С нами с:
    22 апр 2019
    Сообщения:
    4
    Симпатии:
    0
    Спасибо!
    я прочитал про классы исключений и видимо ничего не понял... Вот пробую сделать простой пример по аналогии:
    PHP:
    1. try{
    2. $s=$j/0;
    3. } catch( Throwable $e){
    4.     echo"error!";
    5. }
    я ожидаю что будет выведено " error! ", но все равно выводится "Warning: Division by zero"

    зачем нужна переменная $e ? В примерах документации она есть. но не описывается зачем оно нужно.
     
  4. Kardamon

    Kardamon Новичок

    С нами с:
    22 апр 2019
    Сообщения:
    4
    Симпатии:
    0
    Может кто-нибудь объяснить как заставить приведенный выше кусок кода работать?
    Или исключение можно вызвать только если Бросить его через throw - тогда смысла в нем нету
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Какая версия php? Конструкции типа 1 / 0 стали бросать исключения только в php 7, и там есть условия. В принципе, такие ошибки я и не отлавливал никогда с помощью try/catch, так что мне до фени эта фитча. Обычно отлавливается то, что кидалось с помощью throw.
     
  6. Kardamon

    Kardamon Новичок

    С нами с:
    22 апр 2019
    Сообщения:
    4
    Симпатии:
    0
    Версия php7.2
    А с помощью чего еще? если я не знаю какая может произойти ошибка, то я и не могу кинуть никакого конкретного исключения..
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Там, где у меня потенциально может быть деление на ноль, я просто if-ом проверяю, чтоб не было в знаменателе нуля :) Может сейчас кто-то, кто пользуется этой фитчей, расскажет про то, когда 1/0 бросит исключение. Я это прочитал и отложил на полку "любопытно, но не важно". Тут написано, что нефатальные ошибки вроде и не бросают, https://habr.com/ru/post/261451/.


    Обычно в доке функции, которая может бросить исключение, об этом прямо говорится. Конструктор SoapClient не исключение: