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
Форумы портала PHP.SU :: Версия для печати :: перехват исключений
Форумы портала PHP.SU » » Вопросы новичков » перехват исключений

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

1. him - 14 Ноября, 2013 - 20:16:36 - перейти к сообщению
есть некий код код на php, пусть будет:

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

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

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

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

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

изучаю гугле... но что то все противоречиво...
подскажите если кто сталкивался...
2. Deonis - 14 Ноября, 2013 - 20:23:15 - перейти к сообщению
him пишет:
в других языках это делается с помощью
try
Не поверите, но в php точно так же можно работать с исключениями.
3. Мелкий - 14 Ноября, 2013 - 20:29:15 - перейти к сообщению
И поскольку, чтобы исключение поймать, его должен кто-то выбросить - http://us1.php.net/manual/ru/fun...rror-handler.php
4. him - 14 Ноября, 2013 - 20:54:44 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. try {
  3. fputs($conn,"Данные");
  4. }
  5. catch (Exception $e) {
  6.     echo 'ошибка ';
  7. }
  8.  


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

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

ссылки видел... но до конца что то как то прозрение не приходит...
5. caballero - 14 Ноября, 2013 - 20:58:25 - перейти к сообщению
Цитата:
таким образом я все перехвачу?

все что выбросит функция fputs(). то есть ничего.
6. him - 14 Ноября, 2013 - 21:05:32 - перейти к сообщению
Цитата:
все что выбросит функция fputs(). то есть ничего.

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

и как написать что бы перехватовало
7. Voodoo - 14 Ноября, 2013 - 21:09:29 - перейти к сообщению
him пишет:
Цитата:
все что выбросит функция fputs(). то есть ничего.

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

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


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

например так
8. Мелкий - 14 Ноября, 2013 - 21:12:29 - перейти к сообщению
Поскольку исторически исключений в php не было, почти все встроенные функции исключения не выбрасывают.
Это решается так: с помощью set_error_handler вешается обработчик на ошибки, из которого генерируется exception.

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

Странно, а вроде бы сослались на опыт в других ЯП.
catch (класс_исключения объект_исключения) {}
Допустимо использование для одного try нескольких catch, как в той же Java.
9. him - 14 Ноября, 2013 - 21:58:15 - перейти к сообщению
хорошо.
а есть какие нибудь методы не выводить ошибку php пользователю.
- при обращении к БД
- при ошибках диалога с некими третьими службами (эмуляциями)

ну и так далее..
10. caballero - 15 Ноября, 2013 - 00:05:28 - перейти к сообщению
метод обычно один - проверять возвращаемые данные на коректность.
11. Ch_chov - 15 Ноября, 2013 - 05:14:26 - перейти к сообщению
him пишет:
а есть какие нибудь методы не выводить ошибку php пользователю.
- при обращении к БД
- при ошибках диалога с некими третьими службами (эмуляциями)


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

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

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

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


В общем случае используйте обработчики ошибок
http://forum.php.su/topic.php?fo...14942#1378714942
12. Hapson - 15 Ноября, 2013 - 07:54:36 - перейти к сообщению
him
А не проще писать ошибки в лог, а не вываливать нервным юзверям на экран?
Да и в нормальном коде всегда знаешь, где херня может случиться. Не проще
PHP:
скопировать код в буфер обмена
  1.  
  2. if(что-то случилось){
  3.     echo "юзверь, будь спокоен, сайт не работает. ХЗ... чета случилось.";
  4. }
  5.  
13. Zuldek - 15 Ноября, 2013 - 09:35:32 - перейти к сообщению
не проще.
14. him - 15 Ноября, 2013 - 18:51:40 - перейти к сообщению
@!copy
Что означает значок собаки?

Как писать в логи а не выводить на экран, надо как то переопределить стандарный поток?
15. teddy - 15 Ноября, 2013 - 18:57:01 - перейти к сообщению
him пишет:
Что означает значок собаки?

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

это все при включенных ошибках, естественно. Ибо если у вас стоит денвер, то вывод notice отключен по умолчанию...

 

Powered by ExBB FM 1.0 RC1