За последние 24 часа нас посетили 16863 программиста и 1757 роботов. Сейчас ищут 759 программистов ...

Остановка выполнения при ошибке в php7

Тема в разделе "PHP для новичков", создана пользователем machetero, 5 окт 2016.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    При подключении файла в php7 с синтаксической ошибкой, сделанной намерено, выполнение скрипта прекращается. Почему ? Блока try catch нету. Должно вылетать исключение и выполнение должно продолжаться.
    Вызываемый файл:
    PHP:
    1. <?php
    2.  
    3. echo "before error<br>";
    4. include __DIR__.'/new.php';
    5. echo "after error";
    Подключаемый файл:
    PHP:
    1. <?php
    2. class app
    3. {
    4.  
    5.     public function throwex(){
    6.     echo 'now ex will be thrown';
    7.     int = 10/0;
    8.     echo 'throwing was done';
    9.     }
    10. }
    Строка "after error" не выводиться.
    Неужели теперь при любой ошибке в php7 выполнение скрипта будет прекращаться ?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    1) Деление на ноль - это не синтаксическая ошибка. Это ошибка деления на ноль.
    2) Я не вижу у тебя нигде кода вызова throwex();
    3) Я не вижу у тебя в классе конструктора, а он, если не ошибаюсь, обязан присутствовать в php7. Может, ошибка из-за этого?
    4) Вообще, отображение ошибок не забыл включить?
     
  3. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Там знак бакса пропущен в присвоении. Деление на ноль даёт ворнинг.
    Отображение включено. Выводится parse error. Хотя в мане написано что не перехваченые исключения-ошибки должны превращаться в fatal error.

    Единственное что работает, это перехват try catch'ем этой ошибки.
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Пардоньте, не заметил. Последние месяца два пишу исключительно на JS, и глаз привык к переменным без доллира.

    Ну дык Parse error - это тебе для понимания, а по коду ошибки она может проходить как Fatal.

    Далее. Читаем:

    В PHP 7 при возникновении фатальных ошибок (E_ERROR) и фатальных ошибок с возможностью обработки (E_RECOVERABLE_ERROR) будет выброшен exception, а не произойдет завершение скрипта.

    У тебя это и происходит. Это нормальное поведение исключений - если их не перехватывать, приложение аварийно завершается. Просто раньше оно падало в любом случае, а теперь можно обернуть это дело в try/catch, ловить ошибку там, и не бояться, что у тебя все обрушится.
    --- Добавлено ---
    Вот тебе из доков:

     
    machetero нравится это.
  5. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Раньше было лучше тем, что когда случалась не фатальная ошибка, код после неё продолжал выполняться.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Протестую. Когда код работает после фатальной ошибки, это нифига не лучше. Вся система в разнос пойти может.
     
  7. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Раньше было лучше тем, что когда случалась не фатальная ошибка, код после неё продолжал выполняться.
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.574
    Симпатии:
    1.757
    Исключение бросается, ты его не ловишь. А непойманное исключение - фатальная ошибка. Вот попробуй так:
    PHP:
    1. <?php
    2. try {
    3.     include __DIR__ . "/new.php";
    4. } catch (Error $e) {
    5.     echo $e->getMessage() . "<br>";
    6. }
    7.  
    8. echo "after error";
    Я уже попробовал, всё как задумано
    Код (Text):
    1.  
    2. syntax error, unexpected '='
    3. after error
    --- Добавлено ---
    А такая ошибка синтаксиса всегда вызывала остановку выполнения скрипта раньше.
     
  9. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Просто обычно в try catch не заворачивают какие то мелкие куски кода(а в них может произойти ошибка), а заворачивают целиком весь код, так что после catch уже никаких вызовов нет.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.574
    Симпатии:
    1.757
    А смысл заворачивать весь код? Я как раз-таки относительно небольшие куски кода в try { } catch() {} оборачиваю, особенно там, где ошибка не предполагается, но если произойдёт - её возможно обработать. А ловлей синтаксических ошибок через catch как не занимался, так и не буду заниматься. Их не должно быть в production, а при разработке я хочу их сразу же видеть, так что пусть себе прерывается
     
  11. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Вообще ты прав.
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ты ошибки парсинга ловить собрался чтоль трай-кэчем? По-моему ты решаешь проблему, которую сам себе придумал.
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.574
    Симпатии:
    1.757
    Ну вероятно может быть ситуация, когда это может пригодиться, иначе не ввели бы в язык. Например, пригодилось бы в WordPress. Сейчас, если допустить в файле functions.php активной темы синтаксическую ошибку, валится весь сайт вместе с админкой. А если бы подключение functions.php темы было реализовано через новый механизм php 7, можно было бы в админке красивое сообщение показать "Файл functions.php вашей темы содержит синтаксическую ошибку"
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Я тебе отвечу твоими же словами:

     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.574
    Симпатии:
    1.757
    Так проблема в том, что темки зачастую пишет пользователь wordpress, а не авторы движка.
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну дык пишешь ты тему для вордпресса - увидел, что все обвалилось к чертовой матери, поправил, заработало.

    Или ты имеешь ввиду случай, когда какой-то мудак выложил тему или модуль с ошибкой, и они вместе, весело и с брызгами положили сайт незадачливому блоггеру?
     
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.574
    Симпатии:
    1.757
    Ну да. И куча пользователей wordPress, которые правят тему методом копипасты с кривых сайтов. Вот недавно я участвовал в написании плагина для wordPress, который массово используется. И имею счастье наблюдать, какие вопросы приходят от пользователей.