Смой кровью свои ошибки! Никита "red_way" Кислицин Xakep, номер #064, стр. 064-118-1 (nikitoz@real.xakep.ru, www.ired.ru) Обработка ошибок в PHP-сценариях Ошибки в работе программиста неизбежны. Они могут быть прогнозируемыми, а могут и неожиданными, могут быть решаемыми, а могут преследовать разработанную систему очень долго, всплывая в самые ответственные моменты. Именно поэтому искусство программирования включает в себя не только умение вовремя их обнаруживать и устранять, но и предвидеть. О методах обнаружения и борьбы с ошибками в web-системах, реализованных на PHP, и пойдет речь ниже. Все ошибки в программировании можно разделить на четыре большие категории: * Синтаксические ошибки. Их причиной служит неверный синтаксис программы, который не позволяет транслятору верно интерпретировать написанный код. * Семантические ошибки. Они возникают в процессе выполнения программой семантически верного кода. * Логические ошибки - самые неприятные и сложные в отладке. Сообщение об ошибке не выводится, однако программа делает не то, что хотел программист. Порой отладка таких ошибок занимает огромное количество времени, порождает море новых проблем и заставляет программиста понервничать. * Ошибки окружения. Возникают не по вине программиста, а в результате влияния внешних факторов, которые программист не способен изменить. Если ты хоть раз в жизни самостоятельно писал и отлаживал какую-то программу, кроме "Hello World", тебе хорошо знакомы все эти типы ошибок. Само собой, я не буду подробно рассказывать, что представляет собой каждая из них, а ограничусь той краткой характеристикой, которую привел. Интересно другое - как интерпретатор PHP действует при обнаружении ошибки, и каким образом можно контролировать его действия. Ведь, согласись, если ты разработал заказчику систему за $1500, а во время презентации случайно выползет сообщение типа "Warning! 0 is not a MySQL result index in ...", это будет полный ахтунг :). Именно поэтому в коммерческих системах очень важно контролировать все сообщения об ошибках и перехватывать их, заменяя дружелюбными сообщениями, которые сгладят вину перед заказчиком :). Кроме того, сообщения об ошибках могут предоставить бесценную информацию взломщику твоей системы - а это едва ли в твоих интересах. Сообщения об ошибках в PHP очень информативны - ведь они предназначаются программисту, позволяют ему эффективнее устранить неполадку. Внимательный человек заметит, что все сообщения об ошибках строятся по одному шаблону: Уровень ошибки: сообщение, имя файла, строка. Уровни ошибок В зависимости от тяжести ошибок, PHP разделяет их на 2 уровня: "parse error" - синтаксические, "fatal error" - неисправимые ошибки, завершающие выполнение сценария. Кроме того, есть "warnings" - предупреждения и "notices" - "замечания". При возникновении таких проблем, возможно дальнейшее выполнение программы, однако программисту следует обращать на них внимание. Разумеется, PHP предоставляет средства для регулирования того, информацию о каких ошибках следует выводить браузеру. Это зависит от параметра error_reporting, значение по умолчанию которого задается в конфигурационных файлах, а для каждого отдельного сценария его можно определять при помощи одноименной процедуры, единственный параметр которой - целое число - получается следующим образом. Каждому типу ошибок соответствует некоторые значение. Так, 1 соответствует неисправимым ошибкам, 2 - предупреждениям, 4 - синтаксическим ошибкам, а 8 - уведомлениям. Суммируя коды типов ошибок, информацию о которых следует выводить, получаем параметр этой процедуры. Так, например, чтобы вообще не выводить никаких сообщений, следует написать error_reporting(0), а чтобы показывать неисправимые ошибки и предупреждения, параметр функции следует установить равным 3 (1+2). |