Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Исключения в PHP (https://javascript.ru/forum/server/19086-isklyucheniya-v-php.html)

romantik2011 25.07.2011 20:42

Исключения в PHP
 
Написал так:
<?php 
class A{

	function __construct($n,$l,$p){
	 try{
	 if($n="" or $l="" or $p="")
	 throw  new Exception("Ошибка, один из
	  аргументов не передан конструктору!");
	 
	 echo "Имя: ",$n;
	 echo "<br>Логин: ",$l;
	 echo "<br>Пароль: ",$p;
	}catch(Exception $e){
	 echo $e->getMesage();
	}
}

}

$obj = new A("","clown","111");

?>



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

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

ваый 25.07.2011 21:49

if($n*!*=*/!*"" or $l="" or $p="")

И это не единственная ошибка, есть еще.

romantik2011 26.07.2011 00:24

Всё, спасибо так, сработало.
<?php 

class nameExc extends Exception{
	function __construct($msg){
	$msg .=" name!";
	parent::__construct($msg);
	}
}

class loginExc extends Exception{
	function __construct($msg){
	$msg .=" login!";
	parent::__construct($msg);
	}
}

class passExc extends Exception{
	function __construct($msg){
	$msg .=" password!";
	parent::__construct($msg);
	}
}

class A{

	function __construct($n,$l,$p){
	 try{
	 if($n=="")
	 throw  new nameExc("Введите");
     if($l=="")
	 throw  new loginExc("Введите");
     if($p=="")
	 throw  new passExc("Введите");

	}catch(nameExc $e){
	echo $e->getMessage();
	}
	catch(loginExc $e){
	echo $e->getMessage();
	}
	catch(passExc $e){
	echo $e->getMessage();
	}
}

}

$obj = new A("","clown","111");

?>


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

ваый 26.07.2011 00:33

Внимательно читаем, что к чему http://php.net/manual/ru/language.exceptions.php. catch исключений не выбрасывает. Вы не очень понимаете, что к чему в механизме работы исключений.

romantik2011 26.07.2011 01:09

То есть ЗРОУ даёт возможность отправится в кэтч, а без ЗРОУ, трай...кетч не сможет выдавать исключения?

Shaci 26.07.2011 11:06

исключение может в "трай" появиться
в блоке catch исключение можно выбросить повторно

romantik2011 26.07.2011 23:08

А оператор throw даёт возможность выбросить исключение, но в этом не главная его цель, а его цель сразу перелететь на оператора catch с тем же типом создаваемого объекта класса что и в операторе throw и обработать его в КЭТЧ? То есть смысл оператора ЗРОУ чтоб перелететь сразу в кетч, отдать объекту описанного в кетче исключение и обработать его в кетче?

Shaci 26.07.2011 23:39

Цитата:

Сообщение от romantik2011 (Сообщение 115558)
оператор throw даёт возможность выбросить исключение, но в этом не главная его цель

в этом его главная и единственная цель, где это исключение дальше ловиться будет уже не так важно

Shaci 26.07.2011 23:49

Цитата:

Сообщение от romantik2011 (Сообщение 115558)
А оператор throw даёт возможность выбросить исключение, но в этом не главная его цель, а его цель сразу перелететь на оператора catch с тем же типом создаваемого объекта класса что и в операторе throw и обработать его в КЭТЧ? То есть смысл оператора ЗРОУ чтоб перелететь сразу в кетч, отдать объекту описанного в кетче исключение и обработать его в кетче?

ну, приблизительно да, если есть оператор throw, естесственно будет искаться блок catch, т.к. этот оператор выбрасывает исключение, и его надо обработать. Не помню , как в php (подозреваю, что так же), но в java(я имею ввиду java, а не js) выброшенное исключение определенного класса будет обработано блоком catch, ловящим исключение либо того же класса, либо суперкласса


Часовой пояс GMT +3, время: 17:26.