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 :: try...catch Ошибки и Исключения [2]

 PHP.SU

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


 Страниц (3): « 1 [2] 3 »   

> Описание: что есть ошибки, а что есть исключения?
Hapson
Отправлено: 09 Марта, 2014 - 20:09:33
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


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

[+]


Не... фигня это все.
Если написать свой обработчик ошибок и в нем кидать исключение, то тогда в блоках try будут отлавливаться ошибки - это круто.
НО! Если вывалился Notice посреди кода - вне блока try, то в этом случае все - капут. После try выполняется блок catch, а если его нет, то скрипт закончится.
То есть Notice может прервать скрипт.
Конечно можно смотреть в обработчике на тип ошибки и не бросать исключение при Notice.
Блин... я даже не знаю, что лучше. Наверно все же лучше проверять по старинке через if...else


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
OrmaJever Модератор
Отправлено: 09 Марта, 2014 - 20:29:10
Post Id



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


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


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




Hapson пишет:
То есть Notice может прервать скрипт.

да, сам уже понял, но над этим нужно подумать Растерялся


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 09 Марта, 2014 - 20:45:29
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Hapson пишет:
То есть Notice может прервать скрипт.

И это правильно.
Notice - значит что-то уже пошло не так. И в большинстве случаев лучшее, что при этом можно сделать - отметиться в логе и сдохнуть.


-----
PostgreSQL DBA
 
 Top
Hapson
Отправлено: 09 Марта, 2014 - 21:03:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


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

[+]


Мелкий пишет:
Hapson пишет:
То есть Notice может прервать скрипт.

И это правильно.
Notice - значит что-то уже пошло не так. И в большинстве случаев лучшее, что при этом можно сделать - отметиться в логе и сдохнуть.

Вобщем-то да, при нормальной работе Notice не вылазит. А тот кусок где ожидается Notice можно обернуть в try...catch
Например установка переменных из $_POST. Чем каждое поле проверять на isset и !empty, лучше обернуть все в try, а в catch переадресовать юзера


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
OrmaJever Модератор
Отправлено: 09 Марта, 2014 - 22:04:31
Post Id



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


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


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




хотя вот сидел я смотрел на свой код и понял что бессмысленно в обработчике ошибок кидать исключение.
Ну вот давайте подумаем когда может (в продакшене) вылезть нотис или варнинг? Если скрипт правильно написано то ошибки вылезти просто не могут, и соответственно забивать скрипт кучей try - catch блоков ради непонятно какой ошибки как то дико. А если вдруг предположить что я мог что-то упустить и нотис всё таки вылезет то можно просто в обработчике ошибок его записать в файл и идти дальше.
Если я не прав - поправьте.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DelphinPRO
Отправлено: 09 Марта, 2014 - 22:32:17
Post Id



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


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


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




OrmaJever пишет:
А если вдруг предположить что я мог что-то упустить и нотис всё таки вылезет то можно просто в обработчике ошибок его записать в файл и идти дальше.

Абсолютно согласен.

Hapson пишет:
Например установка переменных из $_POST.

Вот неудачный ты пример выбрал. Совсем неудачный. Улыбка
PHP:
скопировать код в буфер обмена
  1. $var = isset($_POST['var']) ? $_POST['var'] : 'defaultValue';

и все, никаких нотайсов. И так везде, где возможен "Undefined variable" ...
Золотое правило: Инициализируйте переменные перед использованием, хоть язык этого и не требует в обязательном порядке.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Hapson
Отправлено: 09 Марта, 2014 - 22:37:23
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


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

[+]


OrmaJever пишет:
хотя вот сидел я смотрел на свой код и понял что бессмысленно в обработчике ошибок кидать исключение.
Ну вот давайте подумаем когда может (в продакшене) вылезть нотис или варнинг? Если скрипт правильно написано то ошибки вылезти просто не могут, и соответственно забивать скрипт кучей try - catch блоков ради непонятно какой ошибки как то дико. А если вдруг предположить что я мог что-то упустить и нотис всё таки вылезет то можно просто в обработчике ошибок его записать в файл и идти дальше.
Если я не прав - поправьте.

Ну да, исключения и ошибки все же разные вещи.
DelphinPRO пишет:
Вот неудачный ты пример выбрал. Совсем неудачный.

Ну почему, удачный.
Я так и делаю в принципе. Либо через isset проверяю, либо сразу инициализирую массив с полями для возврата в форму.
Просто хотелось красивее и проще, но не получилось.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
OrmaJever Модератор
Отправлено: 09 Марта, 2014 - 23:13:02
Post Id



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


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


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




по-моему я сейчас построил очередной велосипед, но он мне блин нравится! Закатив глазки
Называется он "скажем нет нотайсам от GET и POST" Подмигивание
PHP:
скопировать код в буфер обмена
  1. class request implements ArrayAccess {
  2.         private $data;
  3.  
  4.         public function __construct($name) {
  5.                 $this->data = $GLOBALS[$name];
  6.         }
  7.         public function offsetExists ( $offset ) {
  8.                 return isset($this->data[$offset]);
  9.         }
  10.         public function offsetUnset ( $offset ) {
  11.                 unset($this->data[$offset]);
  12.         }
  13.         public function offsetGet ( $offset ) {
  14.                 return isset($this->data[$offset]) ? $this->data[$offset] : '';
  15.         }
  16.         public function offsetSet ( $offset, $value ) {
  17.                 if (is_null($offset)) {
  18.             $this->data[] = $value;
  19.         } else {
  20.             $this->data[$offset] = $value;
  21.         }
  22.         }
  23. }
  24.  
  25. $_GET = new request('_GET');
  26. $_POST = new request('_POST');
  27.  
  28. // /file.php?as=1
  29. echo $_GET['as'];
  30. echo $_GET['saddfsfsdfdssdffds'];


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Hapson
Отправлено: 09 Марта, 2014 - 23:48:37
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


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

[+]


Чет я не понял, почему методы вызываются автоматически..?
Работает, но непонятно как. Просматривал выполнение пошагово - как они вызываются сами?
(Добавление)
Да, и при запросе наверно лучше устанавливать null , а не пустую строку.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
DelphinPRO
Отправлено: 10 Марта, 2014 - 00:17:23
Post Id



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


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


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




PHP:
скопировать код в буфер обмена
  1. $_POST = new request('_POST');
  2. $var = $_POST['var'] ?: 'defaultValue';

прикольно Улыбка
(Добавление)
Hapson пишет:
Чет я не понял, почему методы вызываются автоматически..?

фишка с том, что $_POST после такой операции - объект, реализующий интерфейс ArrayAccess.
При обращении к такому объекту, как к массиву, автоматически вызываются предопределенные методы интерфейса.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Ch_chov
Отправлено: 10 Марта, 2014 - 05:42:42
Post Id



Постоянный участник


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


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




OrmaJever пишет:
по-моему я сейчас построил очередной велосипед, но он мне блин нравится!

https://github[dot]com/symfony/symfo[dot][dot][dot]tion/Request.php
Этот компонент можно использовать отдельно от симфони. Его уже используют многие фреймворки и CMS (Laravel, Drupal, Silex).
 
 Top
OrmaJever Модератор
Отправлено: 10 Марта, 2014 - 11:47:16
Post Id



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


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


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




Ch_chov
но у них это 1854 строки ;) Против моих 30 он не попрёт)))
Hapson пишет:
Работает, но непонятно как.

Магия Подмигивание
(Добавление)
DelphinPRO пишет:
$var = $_POST['var'] ?: 'defaultValue';

Не понял вот и пригодился этот ненужный оператор! Закатив глазки
Единственная проблема это print_r($_GET) выводит не чистый масив, а с ненужной информацией об обьекте


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
esterio
Отправлено: 10 Марта, 2014 - 17:12:45
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




а что будет если $_POST['TestModel']['id'], которого не существует? Нужно еще маггический isset прикрутить и иттератор и сеттер и геттер, вот и получиться 1000 с лишним строк с кучей маггии Радость
 
 Top
DelphinPRO
Отправлено: 10 Марта, 2014 - 18:39:14
Post Id



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


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


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




OrmaJever пишет:
Единственная проблема это print_r($_GET) выводит не чистый масив, а с ненужной информацией об обьекте

какая же это проблема? релизуй магик __toString() в своем реквесте


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
OrmaJever Модератор
Отправлено: 10 Марта, 2014 - 18:39:35
Post Id



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


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


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




esterio пишет:
а что будет если $_POST['TestModel']['id'], которого не существует?

но ведь обращение к ['id'] это уже не обращение к объекту request. Объект request вернул массив, а дальше сами. Я же не могу заменить все массивы в скрипте, это сделано только для глобальных. Да и всё равно это плюс, хотя бы в том что как показал DelphinPRO этот класс оживляет мёртвый оператор ?:
(Добавление)
DelphinPRO пишет:
какая же это проблема? релизуй магик __toString() в своем реквесте

ага! сам попробуй)) Я об этом подумал в первую очередь, но __toString() должен возвращать только строку, никаких массивов. Как вариант можно конечно реализовать __invoke() и будет print_R($_GET()), но это уже не то, т.к. отходим от стандартного синтаксиса Огорчение


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB