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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Estenny
Отправлено: 16 Июня, 2012 - 14:27:14
Post Id



Гость


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


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




Много читал разных объяснений термина 'исключение', но так и не могу понять, зачем они вообще нужны?
Вот, например, предположим, что в функцию приходит 1 аргумент, который должен быть строкой. Выполняем проверку на то, строка это или нет.

Я изучаю код (не мой код) и не понимаю, почему если это условие выполняется, то выполняется этот код:
PHP:
скопировать код в буфер обмена
  1. throw new Exception('Текст ошибки');

Как я понимаю, пользователю просто выведется фраза 'Текст ошибки'. А что еще произойдет и почему нельзя заменить это исключение просто таким кодом:
PHP:
скопировать код в буфер обмена
  1. echo 'Текст ошибки'; return;

Объясните, пожалуйста.
 
 Top
caballero
Отправлено: 16 Июня, 2012 - 14:37:13
Post Id


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


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


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




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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Estenny
Отправлено: 16 Июня, 2012 - 14:42:30
Post Id



Гость


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


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




caballero, ну так я же поймал эту ошибку с помощью условия!
 
 Top
caballero
Отправлено: 16 Июня, 2012 - 14:44:21
Post Id


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


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


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




не поймал а проверил условие
функция is_string не выбрасывает исключений


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Estenny
Отправлено: 16 Июня, 2012 - 14:48:09
Post Id



Гость


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


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




caballero, ну а дальше я просто прекращаю работу функции, что мне с того, что я поймал это исключение? Мне же нужно их ловить, чтобы прекращать работу программы или ее изменять.
 
 Top
Panoptik
Отправлено: 16 Июня, 2012 - 14:52:16
Post Id



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


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




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


-----
Just do it
 
 Top
OrmaJever Модератор
Отправлено: 16 Июня, 2012 - 14:53:43
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




2 примера по сути одного кода. Ещё можно привести пример бросания исключений сквозь функции.
PHP:
скопировать код в буфер обмена
  1. $c = mysql_connect(...);
  2. if( $c ) {
  3.         $d = mysql_select_db( ... );
  4.         if( $d ) {
  5.                 $q = mysql_query( ... );
  6.                 if( $q ) {
  7.                         $r = mysql_fetch_object($q);
  8.                         // ...
  9.                 } else echo 'Query error';
  10.         } else echo 'Selec_db error';  
  11. } else echo 'Connect error';


PHP:
скопировать код в буфер обмена
  1. try {
  2.         $c = mysql_connect(...);
  3.         if(!$c) throw new Exeption('Connect error');
  4.         $d = mysql_select_db( ... );
  5.         if(!$d) throw new Exeption('Selec_db error');
  6.         $q = mysql_query( ... );
  7.         if(!$q) throw new Exeption('Query error');
  8.         $r = mysql_fetch_object($q);
  9.         // ...
  10. } catch (Exception $e) {
  11.         echo $e->getMessage();
  12. }


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Estenny
Отправлено: 16 Июня, 2012 - 15:13:21
Post Id



Гость


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


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




OrmaJever, я понял, спасибо.
(Добавление)
OrmaJever, но ведь если мы ловим исключение, то мы же должны что-то сделать, кроме вывода сообщения? Как-нибудь остановить программу.
 
 Top
caballero
Отправлено: 16 Июня, 2012 - 15:42:03
Post Id


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


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


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




для остановить программу достаточно die
исключения тут не нужны

исключение просто удобный способ возврата ошибок из вложеных функций или объектов а в типизированых языках вернуть ошибку через возврат как в PHP вообще проблематично если функция должна возвращать определенное значение определенного типа


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
OrmaJever Модератор
Отправлено: 16 Июня, 2012 - 16:13:01
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Estenny
Зачем останавливать скрипт? Остановить нужно только то что не будет работать после ошибки, в даном случае если будет ошибка конекта то выбор бд и сам запрос не выполнится и не будет ципной реакции. Вы это можите обработать и повторить попытку в catch или просто написать об ошибке. Ну если страница совсем с этой ошибкой не работает до как сказали выше можно и die() написать, но это крайне редко.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Июня, 2012 - 21:11:21
Post Id



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


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


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




OrmaJever пишет:
можно и die() написать
Только в самом начале, где инклюдится или инициализируется сам bootstrap и основные файлы в которых вьюха, эксепшны и конфиги.

А потом все уже через throw спокойно перехватывается...
 
 Top
Okula
Отправлено: 16 Июня, 2012 - 23:41:08
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


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




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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB