Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключения PHP 
:(
    Опции темы
romantik2011
Дата 25.7.2011, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 20.7.2011

Репутация: нет
Всего: нет



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

HTML
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in C:\www\htdocs\test.ru\www\index.php on line 19


Код

<?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("5","clown","111");

?>

PM MAIL   Вверх
romantik2011
Дата 25.7.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 20.7.2011

Репутация: нет
Всего: нет



Написал так:
Код

<?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");

?>



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

и даже значения переданные конструктору не подставляются.
PM MAIL   Вверх
Muerto
Дата 25.7.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



Начнем пожалуй с того что

Начнем с того что
Код

 if($n=="" or $l=="" or $p=="")

И продолжим
Код

$e->getMessage();


 smile 



--------------------
user posted image
PM MAIL   Вверх
romantik2011
Дата 25.7.2011, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 20.7.2011

Репутация: нет
Всего: нет



Всё, спасибо так, сработало.
Код

<?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?
Зачем нужен всё-таки ЗРОУ, если его же задачу может выполнить КЭТЧ?
PM MAIL   Вверх
romantik2011
Дата 26.7.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 20.7.2011

Репутация: нет
Всего: нет



А оператор throw даёт возможность выбросить исключение, но в этом не главная его цель, а его цель сразу перелететь на оператора catch с тем же  типом  создаваемого объекта класса что и в операторе throw и обработать его в КЭТЧ? То есть смысл оператора ЗРОУ чтоб перелететь сразу в кетч, отдать объекту описанного в кетче исключение и обработать его в кетче?
PM MAIL   Вверх
skyboy
Дата 27.7.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



последний пост не понял smile
"нужно писать throw", потому что выбрасывание исключения(throw) и его перехват(try ... catch или try ... finally) это две разные конструкции/механизма.
демонстрация:
Код

function a() {
 if (rand() > 0.5) {
  throw new Exception("Exeption in " . __FUNCTION__);
 }
}
function b() {
 throw new Exception("Exeption in " . __FUNCTION__);
}
try {
 a();
 b();
} catch (Exception $e) {
 echo $e->getMessage();
}

и никто никуда "не перелетает" при выбрасывании исключения. в смысле, что принцип работы с исключениями - это не if + goto.
PM MAIL   Вверх
krundetz
Дата 27.7.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



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

class Denominator {
    private $denominator;
    public function __construct($denominator) {
        try {
            if($denominator == 0) {
                trow  new Exception('Знаменатель дроби не может быть 0');
            } else {
                $this->denominator = $denominator;
            }
        }
        catch (Exception $e) {
            echo $e->getMesage();
        }
    }
    public function getValue() {
         return $this->denominator;
    }
}
$denominator = new Denominator(0);
$a = 1 / $denominator->getValue();

Попробуйте запустить такой код. Надеюсь понятно, что этот написанный по вашему шаблону пример не исключит ситуацию деления на 0.

P.S. Советую также подучить что такое классы и ООП.

Это сообщение отредактировал(а) krundetz - 27.7.2011, 11:42


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.