Если программа на PHP написана синтаксически некорректно, то интерпретатор выводит на экран соответствующее сообщение, а также указание на файл и строчку в нем, где по его мнению произошла ошибка.
В этом уроке мы научимся работать с ошибками.
Например, синтаксическая ошибка возникает, когда код был записан с нарушением грамматических правил. В человеческих языках грамматика важна, но текст с ошибками чаще всего можно понять и прочитать.
А вот в программировании все строго. Любое мельчайшее нарушение — и программа даже не запустится. Примером может быть забытая ;
, неправильно расставленные скобки и другие детали.
Вот пример кода с синтаксической ошибкой:
<?php
print_r('Hodor')
// PHP Parse error: syntax error, unexpected end of file in /private/var/tmp/index.php on line 4
Подобные синтаксические ошибки в PHP относятся к разряду Parse error. Как видно, в конце приводится путь до файла и номер строки.
С одной стороны, ошибки Parse error — самые простые, потому что они связаны исключительно с грамматическими правилами написания кода, а не с самим смыслом кода. Их легко исправить: нужно лишь найти нарушение в записи.
С другой стороны, интерпретатор не всегда может четко указать на это нарушение. Поэтому бывает, что забытую скобку нужно поставить не туда, куда указывает сообщение об ошибке.
Уведомления и предупреждения
В силу исторических причин PHP имеет непривычную систему ошибок.
В других аналогичных языках ошибки делятся на два типа:
- Ошибки парсинга
- Исключения
В PHP к ним еще добавляются:
- Notice
- Warning
- Fatal Error
Если программа написана синтаксически некорректно, то мы не сможем запустить ее. Тут все просто: такие ошибки невозможно обработать, и мы их видим сразу.
Все остальные ошибки в других языках реализованы с помощью механизма исключений, который мы рассмотрим позже.
Главное — это именно ошибки. Но их всегда можно перехватить и обработать. Пользователь программы даже не узнает, что они возникли.
В PHP многие ошибки являются исключениями (что хорошо), но далеко не все (что плохо). Например, попытка использовать несуществующую переменную в PHP не приводит к возникновению исключения — то есть ошибки. Программа продолжает работать, но в выводе работы программы можно заметить следующие строки:
<?php
$i += 3;
// PHP Notice: Undefined variable: i in php shell code on line 1
PHP Notice — это даже не ошибка, а просто предупреждение, что код написан не очень хорошо, но останавливать его выполнение никто не будет.
В любом другом языке попытка использовать несуществующую переменную приводит к ошибке, и программисту придется ее исправить, но только не в PHP.
Таким поведением PHP поощряет разработчиков писать плохой код, который не заработал бы ни в одном другом языке программирования. Какое при этом будет поведение у системы — большой вопрос.
То же самое касается и PHP Warning. Это тоже предупреждения, но более серьезные. Ну, и наконец, Fatal Error — это уже настоящие ошибки. В отличие от исключений, они не могут быть обработаны и просто завершают выполнение программы.
Что еще интереснее: PHP позволяет подавить вывод этих предупреждений и сделать вид, что все хорошо:
<?php
error_reporting(0);
Еще один механизм подавления — оператор @
, который можно поставить перед любым вызовом функции. Он выключает Notice и Warning, происходящие внутри этой функции:
<?php
function foo()
{
$i += 1;
}
foo(); // Notice: Undefined variable: i
@foo(); // Ничего не выводится, как будто все хорошо
Как вы понимаете, такой подход в разработке не сулит ничего хорошего. Любые Notice или Warning нужно рассматривать как серьезные ошибки, требующие исправления.
На Хекслете эта проблема решена так: все оповещения типа Notice и Warning автоматически превращаются в исключения, а значит рассматриваются как настоящие ошибки. Такого поведения можно добиться, используя xdebug.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»