При подключении файла в php7 с синтаксической ошибкой, сделанной намерено, выполнение скрипта прекращается. Почему ? Блока try catch нету. Должно вылетать исключение и выполнение должно продолжаться. Вызываемый файл: PHP: <?php echo "before error<br>"; include __DIR__.'/new.php'; echo "after error"; Подключаемый файл: PHP: <?php class app { public function throwex(){ echo 'now ex will be thrown'; int = 10/0; echo 'throwing was done'; } } Строка "after error" не выводиться. Неужели теперь при любой ошибке в php7 выполнение скрипта будет прекращаться ?
1) Деление на ноль - это не синтаксическая ошибка. Это ошибка деления на ноль. 2) Я не вижу у тебя нигде кода вызова throwex(); 3) Я не вижу у тебя в классе конструктора, а он, если не ошибаюсь, обязан присутствовать в php7. Может, ошибка из-за этого? 4) Вообще, отображение ошибок не забыл включить?
Там знак бакса пропущен в присвоении. Деление на ноль даёт ворнинг. Отображение включено. Выводится parse error. Хотя в мане написано что не перехваченые исключения-ошибки должны превращаться в fatal error. Единственное что работает, это перехват try catch'ем этой ошибки.
Пардоньте, не заметил. Последние месяца два пишу исключительно на JS, и глаз привык к переменным без доллира. Ну дык Parse error - это тебе для понимания, а по коду ошибки она может проходить как Fatal. Далее. Читаем: В PHP 7 при возникновении фатальных ошибок (E_ERROR) и фатальных ошибок с возможностью обработки (E_RECOVERABLE_ERROR) будет выброшен exception, а не произойдет завершение скрипта. У тебя это и происходит. Это нормальное поведение исключений - если их не перехватывать, приложение аварийно завершается. Просто раньше оно падало в любом случае, а теперь можно обернуть это дело в try/catch, ловить ошибку там, и не бояться, что у тебя все обрушится. --- Добавлено --- Вот тебе из доков:
Протестую. Когда код работает после фатальной ошибки, это нифига не лучше. Вся система в разнос пойти может.
Исключение бросается, ты его не ловишь. А непойманное исключение - фатальная ошибка. Вот попробуй так: PHP: <?php try { include __DIR__ . "/new.php"; } catch (Error $e) { echo $e->getMessage() . "<br>"; } echo "after error"; Я уже попробовал, всё как задумано Код (Text): syntax error, unexpected '=' after error --- Добавлено --- А такая ошибка синтаксиса всегда вызывала остановку выполнения скрипта раньше.
Просто обычно в try catch не заворачивают какие то мелкие куски кода(а в них может произойти ошибка), а заворачивают целиком весь код, так что после catch уже никаких вызовов нет.
А смысл заворачивать весь код? Я как раз-таки относительно небольшие куски кода в try { } catch() {} оборачиваю, особенно там, где ошибка не предполагается, но если произойдёт - её возможно обработать. А ловлей синтаксических ошибок через catch как не занимался, так и не буду заниматься. Их не должно быть в production, а при разработке я хочу их сразу же видеть, так что пусть себе прерывается
Ты ошибки парсинга ловить собрался чтоль трай-кэчем? По-моему ты решаешь проблему, которую сам себе придумал.
Ну вероятно может быть ситуация, когда это может пригодиться, иначе не ввели бы в язык. Например, пригодилось бы в WordPress. Сейчас, если допустить в файле functions.php активной темы синтаксическую ошибку, валится весь сайт вместе с админкой. А если бы подключение functions.php темы было реализовано через новый механизм php 7, можно было бы в админке красивое сообщение показать "Файл functions.php вашей темы содержит синтаксическую ошибку"
Ну дык пишешь ты тему для вордпресса - увидел, что все обвалилось к чертовой матери, поправил, заработало. Или ты имеешь ввиду случай, когда какой-то мудак выложил тему или модуль с ошибкой, и они вместе, весело и с брызгами положили сайт незадачливому блоггеру?
Ну да. И куча пользователей wordPress, которые правят тему методом копипасты с кривых сайтов. Вот недавно я участвовал в написании плагина для wordPress, который массово используется. И имею счастье наблюдать, какие вопросы приходят от пользователей.