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

 PHP.SU

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


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

> Без описания
romantik2011
Отправлено: 25 Июля, 2011 - 19:43:38
Post Id


Новичок


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


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




Читаю про исключения в пхп, решил написать код с исключениями, не срабатывают исключения, а выдаёт ошибку на 19 строке:


CODE (html):
скопировать код в буфер обмена
  1. Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in C:\www\htdocs\test.ru\www\index.php on line 19


PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class A{
  4.  
  5.         function __construct($n,$l,$p){
  6.          try{
  7.          if($n="" or $l="" or $p="")
  8.          throw  new Exception("Ошибка, один из
  9.           аргументов не передан конструктору!");
  10.          
  11.          echo "Имя: ",$n;
  12.          echo "<br>Логин: ",$l;
  13.          echo "<br>Пароль: ",$p;
  14.         }catch(Exception $e){
  15.          echo $e->getMesage();
  16.         }
  17.  
  18. }
  19.  
  20. $obj = new A("5","clown","111");
  21.  
  22. ?>
  23.  

(Отредактировано автором: 25 Июля, 2011 - 19:43:58)

 
 Top
LIME
Отправлено: 25 Июля, 2011 - 19:49:22
Post Id


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


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


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




romantik2011 фигурной скобки не хватает
описание класса не завершено
 
 Top
romantik2011
Отправлено: 25 Июля, 2011 - 20:27:24
Post Id


Новичок


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


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




Написал так:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class A{
  4.  
  5.         function __construct($n,$l,$p){
  6.          try{
  7.          if($n="" or $l="" or $p="")
  8.          throw  new Exception("Ошибка, один из
  9.           аргументов не передан конструктору!");
  10.          
  11.          echo "Имя: ",$n;
  12.          echo "<br>Логин: ",$l;
  13.          echo "<br>Пароль: ",$p;
  14.         }catch(Exception $e){
  15.          echo $e->getMesage();
  16.         }
  17. }
  18.  
  19. }
  20.  
  21. $obj = new A("","clown","111");
  22.  
  23. ?>
  24.  



Я хочу чтоб сработало исключение при пустой передаче первого аргумента конструктору, а исключение не срабатывает, а
выдаёт такой результат:
PHP:
скопировать код в буфер обмена
  1. Имя:
  2. Логин:
  3. Пароль:

и даже значения переданные конструктору не подставляются.
 
 Top
Champion Супермодератор
Отправлено: 25 Июля, 2011 - 20:32:40
Post Id



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


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


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




romantik2011 пишет:
$n=""
Операции сравнения: == и ===. = - это присваивание. Вы присваиваете "" переменной, а "" приводится к false. Поэтому все три условия - false, поэтому эксепшн не бросается.
 
 Top
romantik2011
Отправлено: 25 Июля, 2011 - 20:39:47
Post Id


Новичок


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


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




Вот так вообще выдаёт ошибку:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class A{
  4.  
  5.         function __construct($n,$l,$p){
  6.          try{
  7.          if($n=="" or $l=="" or $p=="")
  8.          throw  new Exception("Ошибка, один из
  9.           аргументов не передан конструктору!");
  10.          
  11.          echo "Имя: ",$n;
  12.          echo "<br>Логин: ",$l;
  13.          echo "<br>Пароль: ",$p;
  14.         }catch(Exception $e){
  15.          echo $e->getMesage();
  16.         }
  17. }
  18.  
  19. }
  20.  
  21. $obj = new A("","clown","111");
  22.  
  23. ?>
  24.  


Цитата:

Fatal error: Call to undefined method Exception::getMesage() in C:\www\htdocs\test.ru\www\index.php on line 14
 
 Top
OrmaJever Модератор
Отправлено: 25 Июля, 2011 - 20:52:43
Post Id



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


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


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




getMessage() Хм


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
romantik2011
Отправлено: 25 Июля, 2011 - 23:25:40
Post Id


Новичок


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


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




Всё, спасибо так, сработало.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. class nameExc extends Exception{
  5.         function __construct($msg){
  6.         $msg .=" name!";
  7.         parent::__construct($msg);
  8.         }
  9. }
  10.  
  11. class loginExc extends Exception{
  12.         function __construct($msg){
  13.         $msg .=" login!";
  14.         parent::__construct($msg);
  15.         }
  16. }
  17.  
  18. class passExc extends Exception{
  19.         function __construct($msg){
  20.         $msg .=" password!";
  21.         parent::__construct($msg);
  22.         }
  23. }
  24.  
  25. class A{
  26.  
  27.         function __construct($n,$l,$p){
  28.          try{
  29.          if($n=="")
  30.          throw  new nameExc("Введите");
  31.      if($l=="")
  32.          throw  new loginExc("Введите");
  33.      if($p=="")
  34.          throw  new passExc("Введите");
  35.  
  36.         }catch(nameExc $e){
  37.         echo $e->getMessage();
  38.         }
  39.         catch(loginExc $e){
  40.         echo $e->getMessage();
  41.         }
  42.         catch(passExc $e){
  43.         echo $e->getMessage();
  44.         }
  45. }
  46.  
  47. }
  48.  
  49. $obj = new A("","clown","111");
  50.  
  51. ?>
  52.  


Меня интересует один вопрос.
Зачем нужно писать throw, если зроу выдаёт исключения ,а потом всё равно идёт переход от него в catch
и КЭТЧ выбрасывает ещё исключение, зачем это нужно? Почему не достаточно одно блока try...catch?
Зачем нужен всё-таки ЗРОУ, если его же задачу может выполнить КЭТЧ?
 
 Top
LIME
Отправлено: 25 Июля, 2011 - 23:33:31
Post Id


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


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


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




в случае если throw не случилось код после него исполняется до конца блока try
если выбросилось исключение выполняется сразу блок catch
другими словами throw не ограничивает блок try ...это как-бы goto что-ли))
(Добавление)
кажется я неясно выразился потому добавлю
throw это такая точка в которой решается будет продолжаться стандартный ход программы(остаток блока Try) или запустится обработчик ошибки(catch)
 
 Top
romantik2011
Отправлено: 26 Июля, 2011 - 00:10:43
Post Id


Новичок


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


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




То есть ЗРОУ даёт возможность отправится в кэтч, а без ЗРОУ, трай...кетч не сможет выдавать исключения?
 
 Top
Champion Супермодератор
Отправлено: 26 Июля, 2011 - 08:53:04
Post Id



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


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


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




romantik2011 пишет:
Вот так вообще выдаёт ошибку:
Очень полезно самостоятельно научиться читать тексты ошибок и понимать их. Там ничего сложного не написано. Обычные человеческие слова. Плюс всегда есть поисковик, в который эти слова можно скопировать.

Конструкция
try {
throw
}catch{
}
это по сути имитация goto и ничего больше. Исключения нужны несколько для других случаев.
Например, вы написали какой-то метод. Этот метод будет использоваться непонятно где и не понятно, в каких условиях. Если в этом методе происходит ошибка, то выводить ее опреатором echo - не круто. Вдруг кодом будет пользоваться человек, говорящий на другом языке или вдруг этот человек захочет ошибку не выводить, а писать в лог.
Поэтому вы в своей функции бросаете ексепшн, а человек потом пользуется вашей функцией вот так
try {
вашафункция()
} catch {
делает в случае ексепшна то, что хочет
}
 
 Top
romantik2011
Отправлено: 26 Июля, 2011 - 22:07:46
Post Id


Новичок


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


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




А оператор throw даёт возможность выбросить исключение, но в этом не главная его цель, а его цель сразу перелететь на оператора catch с тем же типом создаваемого объекта класса что и в операторе throw и обработать его в КЭТЧ? То есть смысл оператора ЗРОУ чтоб перелететь сразу в кетч, отдать объекту описанного в кетче исключение и обработать его в кетче?
 
 Top
LIME
Отправлено: 26 Июля, 2011 - 22:09:57
Post Id


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


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


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




romantik2011 садись 5 Улыбка
 
 Top
romantik2011
Отправлено: 26 Июля, 2011 - 22:12:56
Post Id


Новичок


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


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




Хорошо, а когда тогда не используют зроу, а используют чисто try...catch без ЗРОУ?

(Отредактировано автором: 26 Июля, 2011 - 22:13:21)

 
 Top
LIME
Отправлено: 26 Июля, 2011 - 22:15:37
Post Id


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


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


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




никогда
в этом случае всегда будет выполняться весь try a catch никогда
(Добавление)
throw создает обьект исключение и бросает его
catch ловит и обрабатывает обьект созданый в throw
 
 Top
Stierus Супермодератор
Отправлено: 27 Июля, 2011 - 12:42:08
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




Цитата:
Зачем нужно писать throw, если зроу выдаёт исключения ,а потом всё равно идёт переход от него в catch
и КЭТЧ выбрасывает ещё исключение, зачем это нужно? Почему не достаточно одно блока try...catch?
Зачем нужен всё-таки ЗРОУ, если его же задачу может выполнить КЭТЧ?

В приведенном коде ни один кэтч не выбрасывает исключений ... просто разные блоки катч срабатывают на разные типы исключений.
 
My status
 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