Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: перехват исключений

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: интересуюсь
him
Отправлено: 14 Ноября, 2013 - 20:16:36
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




есть некий код код на php, пусть будет:

fputs($conn,"Данные");

я предполагаю, что в момент выполнения может произойти неожиданная ошибка.
и посетителю сайта выведется страшное ругательство.
что бы не травмировать психику посетителю, я хочу ее скрыть.

то есть написать на экране что то спокойное "ошибка попробуйте позднее"
и залогировать подробности ошибки например в файл.

в других языках это делается с помощью
try

на php я так понимаю надо угадать исключение...
как все исключения перехватить?

изучаю гугле... но что то все противоречиво...
подскажите если кто сталкивался...

(Отредактировано автором: 14 Ноября, 2013 - 20:17:36)

 
 Top
Deonis
Отправлено: 14 Ноября, 2013 - 20:23:15
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




him пишет:
в других языках это делается с помощью
try
Не поверите, но в php точно так же можно работать с исключениями.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Ноября, 2013 - 20:29:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




И поскольку, чтобы исключение поймать, его должен кто-то выбросить - http://us1.php.net/manual/ru/fun...rror-handler.php


-----
PostgreSQL DBA
 
 Top
him
Отправлено: 14 Ноября, 2013 - 20:54:44
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. try {
  3. fputs($conn,"Данные");
  4. }
  5. catch (Exception $e) {
  6.     echo 'ошибка ';
  7. }
  8.  


таким образом я все перехвачу?

Exception $e - это обязательный параметр? а без него нельзя? зачем он нужен?

ссылки видел... но до конца что то как то прозрение не приходит...
 
 Top
caballero
Отправлено: 14 Ноября, 2013 - 20:58:25
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
таким образом я все перехвачу?

все что выбросит функция fputs(). то есть ничего.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
him
Отправлено: 14 Ноября, 2013 - 21:05:32
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Цитата:
все что выбросит функция fputs(). то есть ничего.

почему? поясните пожалуста

и как написать что бы перехватовало
 
 Top
Voodoo
Отправлено: 14 Ноября, 2013 - 21:09:29
Post Id


Новичок


Покинул форум
Сообщений всего: 37
Дата рег-ции: Май 2013  


Помог: 0 раз(а)




him пишет:
Цитата:
все что выбросит функция fputs(). то есть ничего.

почему? поясните пожалуста

и как написать что бы перехватовало


PHP:
скопировать код в буфер обмена
  1. try {
  2. if(!fputs($conn,"Данные")) throw new Exception("Данные не записаны");
  3. }
  4. catch (Exception $e) {
  5.     echo "Брошено исключение: ", $e->getMessage();
  6. }

например так

(Отредактировано автором: 14 Ноября, 2013 - 21:10:23)

 
 Top
Мелкий Супермодератор
Отправлено: 14 Ноября, 2013 - 21:12:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Поскольку исторически исключений в php не было, почти все встроенные функции исключения не выбрасывают.
Это решается так: с помощью set_error_handler вешается обработчик на ошибки, из которого генерируется exception.

him пишет:
Exception $e - это обязательный параметр? а без него нельзя? зачем он нужен?

Странно, а вроде бы сослались на опыт в других ЯП.
catch (класс_исключения объект_исключения) {}
Допустимо использование для одного try нескольких catch, как в той же Java.


-----
PostgreSQL DBA
 
 Top
him
Отправлено: 14 Ноября, 2013 - 21:58:15
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




хорошо.
а есть какие нибудь методы не выводить ошибку php пользователю.
- при обращении к БД
- при ошибках диалога с некими третьими службами (эмуляциями)

ну и так далее..
 
 Top
caballero
Отправлено: 15 Ноября, 2013 - 00:05:28
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




метод обычно один - проверять возвращаемые данные на коректность.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Ch_chov
Отправлено: 15 Ноября, 2013 - 05:14:26
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




him пишет:
а есть какие нибудь методы не выводить ошибку php пользователю.
- при обращении к БД
- при ошибках диалога с некими третьими службами (эмуляциями)


Если работа с БД осуществляется через PDO, то механизм исключений там присутствует.
Для работы с внешними сервисами часто используют какие нибудь ООП абстракции, которое так же поддерживают исключения.

Если вы используете сторонние службы напрямую, то всегда проверяйте полученные данные, для того чтобы ошибка этой службы не привела к ошибки вашего приложения.

Иногода действительно не возможно предотваратить php ошибки. Например, при работе с файловой системой. В этом случае уместно использовать @ для того, чтобы обработать ошибку.

PHP:
скопировать код в буфер обмена
  1. if (@!copy(...)) {
  2.   // Display error message
  3. }


В общем случае используйте обработчики ошибок
http://forum.php.su/topic.php?fo...14942#1378714942
 
 Top
Hapson
Отправлено: 15 Ноября, 2013 - 07:54:36
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


him
А не проще писать ошибки в лог, а не вываливать нервным юзверям на экран?
Да и в нормальном коде всегда знаешь, где херня может случиться. Не проще
PHP:
скопировать код в буфер обмена
  1.  
  2. if(что-то случилось){
  3.     echo "юзверь, будь спокоен, сайт не работает. ХЗ... чета случилось.";
  4. }
  5.  


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Zuldek
Отправлено: 15 Ноября, 2013 - 09:35:32
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




не проще.
 
 Top
him
Отправлено: 15 Ноября, 2013 - 18:51:40
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




@!copy
Что означает значок собаки?

Как писать в логи а не выводить на экран, надо как то переопределить стандарный поток?
 
 Top
teddy
Отправлено: 15 Ноября, 2013 - 18:57:01
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




him пишет:
Что означает значок собаки?

эта собака очень злая и способна отогнать "ошибку", которая выдается пользователю.
простой пример
PHP:
скопировать код в буфер обмена
  1. echo  $var;//undefined variable
  2. echo @$var;//ошибок нет, но на самом деле опять undefined variable, просто собака это скрыла

это все при включенных ошибках, естественно. Ибо если у вас стоит денвер, то вывод notice отключен по умолчанию...
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB