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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключения в ПХП 
:(
    Опции темы
superphp
Дата 6.4.2013, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не работает пример с исключениями с офиц. сайта ПХП.
Код


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

try {
    echo inverse(5) . "\n";
} catch (Exception $e) {
    echo 'Поймано исключение: ',  $e->getMessage(), "\n";
} finally {
    echo "Первое finally.\n";
}

try {
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Поймано исключение: ',  $e->getMessage(), "\n";
} finally {
    echo "Второе finally.\n";
}

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


Parse error: syntax error, unexpected '{' in D:\server\super-php\test.ru\www\index.php on line 13
PM MAIL   Вверх
Arantir
Дата 6.4.2013, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Почему половина ответов сводиться к цитированию текста той же страницы, на которую ссылается автор темы?

Цитата

In PHP 5.5 and later, a finally block may also be specified after the catch blocks. Code within the finally block will always be executed after the try and catch blocks, regardless of whether an exception has been thrown, and before normal execution resumes.


Это сообщение отредактировал(а) Arantir - 6.4.2013, 16:06


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
superphp
Дата 6.4.2013, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Почему кэтч не ловит у меня исключение?

Код

<?php

class MyException extends Exception { }

class Test {
    public function testing($x) {
        try {
        echo 1/$x;     
        } catch (MyException $e) {
        echo $e->getMessage('Деление на ноль.');
        }
}

}
$foo = new Test;
$foo->testing(0);

?>


PM MAIL   Вверх
Arantir
Дата 6.4.2013, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Да потому что деление на ноль — это не исключение, а ошибка уровня warning. 
Для ясности скажу что, в компилируемых языках ошибки вызываются еще при компиляции, а исключения могут быть вызваны в процессе работы программы.
Любое исключение должно быть сначала выброшено, а уж потом отловлено. 
Код

<?php
class MyException extends Exception { }

class Test {
    public function testing($x) {
        try {
         if ($x == 0)
             throw new MyException('Деление на ноль.');
         echo 1/$x;     
        } catch (MyException $e) {
         echo $e->getMessage();
        }
}
}
$foo = new Test;
$foo->testing(0);
?>


Исключения — не неотъемлемое свойство языка, это просто дополнительный функционал для разработчика. 

Это сообщение отредактировал(а) Arantir - 6.4.2013, 19:31


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
bars80080
Дата 8.4.2013, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



мне казалось, что исключение должно предотвращать сообщение об ошибке

как её заглушить без "собаки" в этом варианте?

Код

$str = 'O:8:"stdClass":2:{s:8:"messages";O:8:"stdClass":0:{}s:11:"reservation";O:8:"st';

try {
    $arr = unserialize($str);
    if(empty($arr)) { throw new Exception('ABC'); }
} catch(Exception $e) {
    var_dump($e);
}

PM MAIL WWW   Вверх
Чучмек
Дата 8.4.2013, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(bars80080 @  8.4.2013,  10:54 Найти цитируемый пост)
как её заглушить без "собаки" в этом варианте?
А чем собака не нравится?



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
bars80080
Дата 9.4.2013, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



ну так что? пять лет на протяжении каждого дня здесь активно стыдили новичков за использование собак, но в реальности оказывается без них никуда?
это и есть "правильное" использование исключений?
PM MAIL WWW   Вверх
Arantir
Дата 9.4.2013, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Цитата(bars80080 @  9.4.2013,  08:50 Найти цитируемый пост)
пять лет на протяжении каждого дня здесь активно стыдили новичков за использование собак, но в реальности оказывается без них никуда?

Стыдили, потому что те лепили их куда вздумается, при первой возможности, лишь бы избавится от лишних проверок и назойливых сообщений, что в итоге приводит к невозможности определить причину проблемы, если все "просто не работает".

А "мягкая" проверка с выбрасыванием исключения — это уже совершенно другое дело. Как минимум, это укажет на проблемную часть кода, где снять собаку для прочтения ошибки уже дело нехитрое.
Ну что поделаешь, если не придумали стандартного "isSerialazable"... Для большинства остальных потенциальных ошибок есть всякие file_exists, empty, != null и прочее, вместе чего, обычно, и лепят собаку новички.

Добавлено @ 10:14
А вообще — http://www.php.net/manual/ru/function.set-error-handler.php

Это сообщение отредактировал(а) Arantir - 9.4.2013, 10:24


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
bars80080
Дата 9.4.2013, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



да, так вроде всё как надо
Код


set_error_handler('user_error_handler');

$str = 'O:8:"stdClass":2:{s:8:"messages";O:8:"stdClass":0:{}s:11:"reservation";O:8:"st';

try {
    $arr = unserialize($str);
    if(empty($arr)) { throw new Exception('ABC'); }
} catch(Exception $e) {
    var_dump($e);
}

function user_error_handler($errno, $errstr) {
    if($errno == 8) {
        return true;
    }
    return false;
}


остаётся один вопрос: код ошибки "8" указывает только на проблемы с unserialize или на целую группу ошибок (тип ошибки)?

где вообще в документации перечень номеров ошибок?
PM MAIL WWW   Вверх
Fortop
Дата 9.4.2013, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bars80080 @  9.4.2013,  09:50 Найти цитируемый пост)
это и есть "правильное" использование исключений? 

А причем тут исключения?

Если есть желание
Цитата(bars80080 @  8.4.2013,  10:54 Найти цитируемый пост)
как её заглушить без "собаки" в этом варианте?



По факту
http://php.net/manual/en/function.set-error-handler.php
Флаг вам в руки и барабан на шею.
Для корректной обработки ошибок

Соответственно там же можно прочесть о
Цитата(bars80080 @  9.4.2013,  11:53 Найти цитируемый пост)
остаётся один вопрос: код ошибки "8" указывает только на проблемы с unserialize или на целую группу ошибок (тип ошибки)?


Добавлено через 8 минут и 46 секунд
Цитата(Arantir @  9.4.2013,  10:13 Найти цитируемый пост)
Ну что поделаешь, если не придумали стандартного "isSerialazable"

http://php.net/manual/en/class.serializable.php


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Arantir
Дата 9.4.2013, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Цитата(Fortop @  9.4.2013,  12:05 Найти цитируемый пост)
http://php.net/manual/en/class.serializable.php 

А? Я вообще-то имел ввиду функцию по аналогии с is_null, is_float, is_array и т.п. И такой функции в классе Serializable нет.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
bars80080
Дата 9.4.2013, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(Fortop @  9.4.2013,  13:05 Найти цитируемый пост)
Соответственно там же можно прочесть о
Цитата(bars80080 @  9.4.2013,  11:53 )
остаётся один вопрос: код ошибки "8" указывает только на проблемы с unserialize или на целую группу ошибок (тип ошибки)?

то есть восьмёрка указывает только на то, что это E_NOTICE?
тогда придётся парсить само сообщение об ошибке, ища слово unserialize
PM MAIL WWW   Вверх
Fortop
Дата 9.4.2013, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bars80080 @  9.4.2013,  15:20 Найти цитируемый пост)
то есть восьмёрка указывает только на то, что это E_NOTICE?

Именно

Цитата(bars80080 @  9.4.2013,  15:20 Найти цитируемый пост)
тогда придётся парсить само сообщение об ошибке, ища слово unserialize 

А зачем?
Просто пробрасывать общее исключение (Exception) с сообщением ошибки.

Добавлено через 3 минуты и 33 секунды
Цитата(Arantir @  9.4.2013,  15:06 Найти цитируемый пост)
А? Я вообще-то имел ввиду функцию по аналогии с is_null, is_float, is_array и т.п. И такой функции в классе Serializable нет. 

Какие типы в php не сериализуются?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Arantir
Дата 9.4.2013, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Цитата(Fortop @  9.4.2013,  19:02 Найти цитируемый пост)
Какие типы в php не сериализуются? 

И любят же люди к словам придираться, аж жуть берет... Как будто всего остального написанного просто не существует. Все время речь шла о функции unserialize, и проверка касается ее же, о чем можно догадаться из контекста. В названии просто опечатка в виде отсутствия "un". 
Не надо же на таких вещах оффтоп начинать... =)


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Fortop
Дата 10.4.2013, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Arantir @  9.4.2013,  22:26 Найти цитируемый пост)
И любят же люди к словам придираться, аж жуть берет... Как будто всего остального написанного просто не существует. Все время речь шла о функции unserialize, и проверка касается ее же, о чем можно догадаться из контекста. В названии просто опечатка в виде отсутствия "un". 

А функция unserialize принимает в качестве аргумента строку.
Собственно провести валидацию не занимаясь парсингом этой строки невозможно.
Поэтому именно false и NOTICE сигнализирует об этом

Единственное неудобство заключается в том, что для 
Код

string(4) "b:0;"

вернет тоже false.
Т.е. опираться лишь на возвращаемое значение рисковано.


--------------------
Мир это Я.
Живее всех живых.
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.0602 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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