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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> class Exception, Обработка искдючений 
:(
    Опции темы
Logree
Дата 15.6.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть такой класс
(я честно говоря не знаю содержаться ли ошибки из mysqli_connect_error() в mysqli_error()  написал так)

myException
Код

   class MySqliException extends Exception {
    
    protected $conect_error;
    protected $conect_errno;
    
    public function _constrct($message = FALSE,$code = FALSE) 
    {
        if(!$message) {            
            $this->message = mysqli_error();
            $this->conect_error = mysqli_connect_error();
        }
        if(!$code) {
            $this->code = mysqli_errno();
            $this->conect_errno = mysqli_connect_errno();
        }
    }
    
    public function getConnect_Error() 
    {
        return $this->conect_error;
    }
    public function getConnect_Errno() 
    {
        return $this->conect_errno;
    }
  }


далее делаем ошибку(неверный пароль)
Код

    try {
    $db = new mysqli('127.0.0.1','root','pass');
    
} catch (MySqliException $e) {
    echo $e->getConnect_Error().'<br>'.$e->getCode();
}

вылезло
Код

Warning: mysqli::mysqli() [mysqli.mysqli]: (28000/1045): Access denied for user 'root'@'localhost' (using password: YES) in C:\www\index.php on line 47


Почему? Может я не до конца понимаю как это должно работать? Объяснения.


Это сообщение отредактировал(а) Logree - 15.6.2008, 17:02


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
Feldmarschall
Дата 15.6.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



А чего ты ждал?
PM   Вверх
Logree
Дата 15.6.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я ждал что появится Строка ошибки и её код

(Эта строка появляется в любом случае)

при отключенных display_errors не показывает ничего!

но ведь произошла исключительная ситуация значит код ошибки должен быть в классе Exception. почему не так так?


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
krundetz
Дата 15.6.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

try
{
//некий блок кода
}
catch(Одно исключени){}
catch(Другое исключение){}
...
catch(Исключение общее для всех){}

Рекомендую прочитать про исключения поподробнее.
Насколько я в курсе mysqli как раз удостаивался коритики за то что там одно исключение на все случае.
Да возможно вам поможет метод toString()

Это сообщение отредактировал(а) krundetz - 15.6.2008, 19:14


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Glip
Дата 15.6.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Logree @  15.6.2008,  17:44 Найти цитируемый пост)
значит код ошибки должен быть в классе Exception

а почему он там должен быть? откуда система знает что нужно генерировать именно MySqliException и если на то пошло Exception вообще.

Хотите вместо ошибок исключения? Определяйте свой обработчик ошибок set_error_handler()

Добавлено через 1 минуту и 14 секунд
Цитата(krundetz @  15.6.2008,  19:12 Найти цитируемый пост)
Обычно в более развитых языках делается так

в php тоже так делается


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


Опытный
**


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

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



Что-то я совсем запутался, я думал что конструкция
Код

try {

} catch (Exception $e) {

}

при наличие ошибки в блоке try помещает все её(ошибки) составляющие в объект Exception: строку, код, файл, line а далле выполняется блок catch... но если это не так зачем тогда нужно исключение если можно пример.

а чем это отличается от 
Код

if () {
 throw new Exception;
}


?

Цитата

а почему он там должен быть? откуда система знает что нужно генерировать именно MySqliException и если на то пошло Exception вообще.

ну так как Exception встроенно, а MySqliException я includ'ил,

из php.net

Код

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Деление на ноль.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Выброшено исключение: ',  $e->getMessage(), "\n";
}

// Продолжение выполнения
echo 'Hello World';
?> 

Результат выполнения данного примера:
0.2
Выброшено исключение: Деление на ноль.
Hello World

Тут же тоже самое что и у меня... или я снова  не понял чего то?

Это сообщение отредактировал(а) Logree - 15.6.2008, 21:02


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
DizelGenerator
Дата 15.6.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый вечер!

Библиотека Mysqli не генерирует исключений, нет. Сама она их не генерирует, поэтому и поймать их в блоке catch не удастся. Выход видится неплохой: расширяете класс mysqli и "вбрасываете" исключения там, где вам необходимо, а потом уже их ловите например:
Код

class myCoolMysqli extends mysqli {
    
    public function __construct(
        $host = '',
        $username = '',
        $password = '',
        $schema = '',
        $port = '',
        $socket = ''
    ) {
        
        $conn = parent::__construct(
            $host,
            $username,
            $password,
            $schema,
            $port,
            $socket
        );
        
        if (mysqli_connect_error()) {
            
            throw new myCoolMysqliException(
                mysqli_connect_error(), mysqli_connect_errno()
            );
            
        }
        
        return $conn;
        
    }
}


Соответственно, вам придется определить и класс myCoolMysqliException, хотя бы таким нехитрым образом:
Код

class myCoolMysqliException extends Exception {}


Вуаля, ловите исключения при коннекте сколько хотите.
PM MAIL   Вверх
krundetz
Дата 15.6.2008, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Logree
Дата 15.6.2008, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



2DizelGenerator

Тоесть "ловля" не получается только для mysqli, значит если я напишу вот так

Код

try {
$f  = fopen('$@#$','r');
} catch(FileException $e) {
    echo $e->getCode();
}

все будет нормально?

интересный пример... ноя думаю для mysqli проще будет обойтись ИФОМ и mysqli_connect_error/no


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
DizelGenerator
Дата 15.6.2008, 21:22 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Logree @ 15.6.2008,  21:11)
Тоесть "ловля" не получается только для mysqli, значит если я напишу вот так

Если как вы написали - снова ничего не поймаете, потому что fopen исключений тоже не генерирует, а генерирует ошибку типа Warning. Понимаете, если исключение не "вбросилось", его невозможно поймать. Практически все стандартные функции php исключений не бросают. Поэтому бросать их надо самому. Напишите так (продолжая наш пример с мускули):

Код

try {

  $db = new myCoolMysqli('localhost', 'root', '12345');

} catch(MyCoolMysqliException $e) {

    echo 'Исключение драйвера базы данных: ', $e->getCode();

} catch (Exception $e) {

  echo 'Исключение ', $e;

}


И вот тогда, если произойдет ошибка при попытке подключиться к базе, вбросится исключение MyCoolMysqliException, которе вы успешно и поймаете. Второй блок catch привел для примера, он ловит все исключения, которые не были пойманы предыдущими блоками catch.
PM MAIL   Вверх
Logree
Дата 15.6.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ВСЁ наконец дошло спасибо всем. особенно DizelGenerator - разжевал.


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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