PHP: Обработка ошибок @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 17 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
arlekino Муж.
соучастник
5
Сообщения: 481
Зарегистрирован: 05.07.01
Откуда: Москва
Заголовок сообщения: PHP: Обработка ошибок
Сообщение Добавлено: 8 Июль 2004, 15:13:28 
Вопрос для знатоков PHP
Есть такая задача. Взгляните на пример кода:
Код:
Здесь обычный контент.


<?//Здесь я ошибаюсь в коде, к примеру вызываю несуществующую функцию
incorrect_function()?>
Далее остальной контент



При возникновении подобной ошибки парсинг кода останавливается и на вывод идет контент до ошибки (то есть до вызова функции) и собственно сообщение о самой ошибке. Так вот суть в чем: нужно скрыть, отключить, снести, вырубить вывод контента ДО ошибки. Если возможно оставить само сообщение - отлично, если нельзя тоже неплохо. Спасибо заранее за помощь.
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 8 Июль 2004, 15:53:40 
http://ru2.php.net/manual/en/function.e … orting.php
конкретно error_reporting(0);

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
arlekino Муж.
соучастник
5
Сообщения: 481
Зарегистрирован: 05.07.01
Откуда: Москва
Сообщение Добавлено: 8 Июль 2004, 16:10:34 
error_reporting(0) отключает конкретно сообщение об ошибке (то есть то же самое что и опция display_errors). Но нужно то скрыть содержимое ДО. А оно показывается.
jettero
новый человек
0
Сообщения: 230
Зарегистрирован: 14.09.03
Сообщение Добавлено: 8 Июль 2004, 17:12:03 
arlekino, включи вывод в буфер в начале и сброс из буфера в конце, тогда если произойдет ошибка то содержимое не выведется
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 8 Июль 2004, 17:18:24 
Смотри в сторону функций с префиксом "ob_", конкретно ob_start().
arlekino Муж.
соучастник
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 />


Неа, не выйдет. Конечно можно перед каждой функцией (я бы даже сказал перед каждой потенциальной фатальной ошибкой) буферизовать вывод. Но это как-то не очень элегантно что-ли. Но думается что именно здесь собака зарыта.
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 8 Июль 2004, 17:46:28 
Ну, во-первых, по-пробуй повешать свой обработчик на буферизацию, во-вторых, попробуй поставить свой обработчик ошибок в PHP, хотя не факт что он сработает на фатальных ошибках, а в-третьих, тебе обязательно выводить контент по мере работы скрипта? Используй какой-нибудь движок шаблонов и выводи контент самостоятельно в конце работы.

Ну и наконец я решительно не понимаю зачем тебе нужно то, что ты спрашиваешь. Ошибок в скрипте быть не должно, ну а уж если есть, то разумнее скрывать сообщения об ошибке (хотя бы в целях security), чем скрывать то, что успело вывесться до этой ошибки.
arlekino Муж.
соучастник
5
Сообщения: 481
Зарегистрирован: 05.07.01
Откуда: Москва
Сообщение Добавлено: 8 Июль 2004, 18:44:12 
ОБРАБОТЧИК! ЕСТЬ!
Код:
<?
function check4errors( $str )
{
   if( $pos = strpos($str, '<b>Fatal error</b>:') )
      return "<html>\n<body>\n\n<h1>PHP says:</h1>\n\n". substr( $str, $pos ). "\n</body>\n</html>";
   else
      return $str;
}
?>
<?ob_start( 'check4errors' )?>
Здесь обычный контент.


<?//Здесь я ошибаюсь в коде, к примеру вызываю несуществующую функцию
incorrect_function()?>
Далее остальной контент


<?$content = ob_get_contents();?>
<?ob_clean()?>
<?=$content?>

Вывод
Код:
<html>
<body>

<h1>PHP says:</h1>

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 где содержатся блоки с дизайном и я могу из любого каталога их показывать, изменять, удалять и так далее). Вообщем если интересует могу по мылу исходник послать. И есть в нем одно слабое место: в случае ошибки все блоки (не обработанные) валились на экран. Ну теперь и эта проблема решена.
jettero
новый человек
0
Сообщения: 230
Зарегистрирован: 14.09.03
Сообщение Добавлено: 8 Июль 2004, 20:21:31 
arlekino, все классно только зачем
Код:
<?$content = ob_get_contents();?>
<?ob_clean()?>
<?=$content?>

почему просто не отправить буфер на вывод?
arlekino Муж.
соучастник
5
Сообщения: 481
Зарегистрирован: 05.07.01
Откуда: Москва
Сообщение Добавлено: 8 Июль 2004, 20:30:24 
jettero, выдержка из кода, я содержимое переменной потом обрабатываю. В конкретном примере конечно это выглядит глупо, не подумал когда писал.
<sergio.ga>
новый человек
0
Сообщения: 102
Зарегистрирован: 13.06.03
Откуда: Харьков, Украина
Сообщение Добавлено: 9 Июль 2004, 14:59:07 
ИМО вернее всё же вешать свой error handler.
Вдруг код попадёт на хост с локализованым РНР? Там "<b>Fatal error</b>" не будет и в помине.
Да и универсальнее получится. Можно и нефатальные ошибки отлавливать и репорты админу мылом слать.
arlekino Муж.
соучастник
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": вставлять какой-нибудь "сигнальный" текст и по нему ловить. Но опция метит все ошибки без разбора :( и их еще надо обрабатывать (какие фатальные, а какие просто предупреждения и можно продолжить обработку шаблона).
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 9 Июль 2004, 16:18:16 
мне кажется немного странным, что разработчики пхп до сих пор не разделили общий выходной поток и поток ошибок. даже в пхп 5 этого не будет (на сколько я знаю). мне кажется, что от подобного даже try-catch не поможет избавится.

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
des
соучастник
0
Сообщения: 407
Зарегистрирован: 14.04.03
Откуда: 40км от Москвы
Сообщение Добавлено: 12 Июль 2004, 10:28:17 
насколько я понял, ты не хочешь чтобы выводилось сообщение?
посмотри это:
http://www.php.net/manual/ru/ref.funchand.php
может подойдет для огики твоей программы

_________________
всё таково, каково оно есть, и больше никаково
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 12 Июль 2004, 12:02:11 
I♥PERL!

:laugh:

_________________
:: metal kick ass ::
<sergio.ga>
новый человек
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() для отлова ошибок при останове.
Удачи!
arlekino Муж.
соучастник
5
Сообщения: 481
Зарегистрирован: 05.07.01
Откуда: Москва
Сообщение Добавлено: 12 Июль 2004, 22:04:02 
des, вызов не существующей функции это так для примера (имитирую фатальную ошибку).
MpaK999, я PERL тоже ♥, но тайной ♥. PHP все-таки - быстро, дешево и сердито :)
<sergio.ga>, о да! Лучше и быть не могло! Спасибо!
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 17 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100