5 Сообщения: 481 Зарегистрирован: 05.07.01 Откуда: Москва
Заголовок сообщения: PHP: Обработка ошибок Добавлено: 8 Июль 2004, 15:13:28
Вопрос для знатоков PHP
Есть такая задача. Взгляните на пример кода:
Код:
Здесь обычный контент. … … <?//Здесь я ошибаюсь в коде, к примеру вызываю несуществующую функцию incorrect_function()?> Далее остальной контент …
При возникновении подобной ошибки парсинг кода останавливается и на вывод идет контент до ошибки (то есть до вызова функции) и собственно сообщение о самой ошибке. Так вот суть в чем: нужно скрыть, отключить, снести, вырубить вывод контента ДО ошибки. Если возможно оставить само сообщение - отлично, если нельзя тоже неплохо. Спасибо заранее за помощь.
5 Сообщения: 481 Зарегистрирован: 05.07.01 Откуда: Москва
Добавлено: 8 Июль 2004, 16:10:34
error_reporting(0) отключает конкретно сообщение об ошибке (то есть то же самое что и опция display_errors). Но нужно то скрыть содержимое ДО. А оно показывается.
5 Сообщения: 481 Зарегистрирован: 05.07.01 Откуда: Москва
Добавлено: 8 Июль 2004, 17:26:36
Буфферизацию я попробовал в первую очередь.
Код:
<?ob_start()?> Здесь обычный контент. … … <?//Здесь я ошибаюсь в коде, к примеру вызываю несуществующую функцию incorrect_function()?> Далее остальной контент … <?ob_clean()?>
Вывод:
Код:
Здесь обычный контент. … … <br /> <b>Fatal error</b>: Call to undefined function: incorrect_function() in <b>\errors\sample.php</b> on line <b>6</b><br />
Неа, не выйдет. Конечно можно перед каждой функцией (я бы даже сказал перед каждой потенциальной фатальной ошибкой) буферизовать вывод. Но это как-то не очень элегантно что-ли. Но думается что именно здесь собака зарыта.
Ну, во-первых, по-пробуй повешать свой обработчик на буферизацию, во-вторых, попробуй поставить свой обработчик ошибок в PHP, хотя не факт что он сработает на фатальных ошибках, а в-третьих, тебе обязательно выводить контент по мере работы скрипта? Используй какой-нибудь движок шаблонов и выводи контент самостоятельно в конце работы.
Ну и наконец я решительно не понимаю зачем тебе нужно то, что ты спрашиваешь. Ошибок в скрипте быть не должно, ну а уж если есть, то разумнее скрывать сообщения об ошибке (хотя бы в целях security), чем скрывать то, что успело вывесться до этой ошибки.
Fatal error</b>: Call to undefined function: incorrect_function() in <b>z:\home\macrotek\www\errors\index.php</b> on line <b>15</b><br />
</body> </html>
Лучше и быть не могло. Спасибо.
А теперь зачем я эту бодягу начал. Дело в том что я и использую шаблонизатор. Свой. Обьяснять как он устроен нелегко, в принципе в нем реализована та часть Парсера (лебедевский который) которая мне больше всего нравиться (то есть в корне сайта есть auto.p где содержатся блоки с дизайном и я могу из любого каталога их показывать, изменять, удалять и так далее). Вообщем если интересует могу по мылу исходник послать. И есть в нем одно слабое место: в случае ошибки все блоки (не обработанные) валились на экран. Ну теперь и эта проблема решена.
0 Сообщения: 102 Зарегистрирован: 13.06.03 Откуда: Харьков, Украина
Добавлено: 9 Июль 2004, 14:59:07
ИМО вернее всё же вешать свой error handler.
Вдруг код попадёт на хост с локализованым РНР? Там "<b>Fatal error</b>" не будет и в помине.
Да и универсальнее получится. Можно и нефатальные ошибки отлавливать и репорты админу мылом слать.
5 Сообщения: 481 Зарегистрирован: 05.07.01 Откуда: Москва
Добавлено: 9 Июль 2004, 15:53:00
Цитата:
Note: The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and E_STRICT.
1. Фатальные ошибки как раз из той оперы. Обработать их таким образом нельзя, сколько я не пытался.
2. ЛОКАЛИЗОВАННЫЙ PHP? Это что за зверь? Кто ж его руссифицировать то задумал и зачем?
3. Конечно мой вариант не универсален. И отлавливает он только надпись "Fatal Error" и не важно есть ли там ошибка или нет. Пока мне пришел в голову только такой вариант. Впрочем, есть вариант юзать опцию PHP "error_prepend_string": вставлять какой-нибудь "сигнальный" текст и по нему ловить. Но опция метит все ошибки без разбора и их еще надо обрабатывать (какие фатальные, а какие просто предупреждения и можно продолжить обработку шаблона).
17 Сообщения: 4362 Зарегистрирован: 25.04.01 Откуда: Москва
Добавлено: 9 Июль 2004, 16:18:16
мне кажется немного странным, что разработчики пхп до сих пор не разделили общий выходной поток и поток ошибок. даже в пхп 5 этого не будет (на сколько я знаю). мне кажется, что от подобного даже try-catch не поможет избавится.
_________________ Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
0 Сообщения: 102 Зарегистрирован: 13.06.03 Откуда: Харьков, Украина
Добавлено: 12 Июль 2004, 15:19:20
arlekino писал(а):
Цитата:
Note: The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and E_STRICT.
1. Фатальные ошибки как раз из той оперы. Обработать их таким образом нельзя, сколько я не пытался.
Да, это я задачу недопонял. Извини.
arlekino писал(а):
2. ЛОКАЛИЗОВАННЫЙ PHP? Это что за зверь? Кто ж его руссифицировать то задумал и зачем?
Это я, похоже, опять гоню. ;) Спутал с Апачем, шеллом или ещё каким гадом.
arlekino писал(а):
3. Конечно мой вариант не универсален. И отлавливает он только надпись "Fatal Error" и не важно есть ли там ошибка или нет. Пока мне пришел в голову только такой вариант. Впрочем, есть вариант юзать опцию PHP "error_prepend_string": вставлять какой-нибудь "сигнальный" текст и по нему ловить. Но опция метит все ошибки без разбора и их еще надо обрабатывать (какие фатальные, а какие просто предупреждения и можно продолжить обработку шаблона).
Я нашёл описание вот такой техники отлова фатальных и парс-еггогов.
Это, в общем, комбинация обработчика ошибок, обработчика буфферизированного потока вывода плюс финт ушами позволяющий этот обработчик устанавливать до возникновения ошибки.
В тексте есть ссылки на предыдущие (менее успешные) методики. В частности использующие register_shutdown_function() для отлова ошибок при останове.
Удачи!
5 Сообщения: 481 Зарегистрирован: 05.07.01 Откуда: Москва
Добавлено: 12 Июль 2004, 22:04:02
des, вызов не существующей функции это так для примера (имитирую фатальную ошибку).
MpaK999, я PERL тоже ♥, но тайной ♥. PHP все-таки - быстро, дешево и сердито <sergio.ga>, о да! Лучше и быть не могло! Спасибо!
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.