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]
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
Не... фигня это все.
Если написать свой обработчик ошибок и в нем кидать исключение, то тогда в блоках try будут отлавливаться ошибки - это круто.
НО! Если вывалился Notice посреди кода - вне блока try, то в этом случае все - капут. После try выполняется блок catch, а если его нет, то скрипт закончится.
То есть Notice может прервать скрипт.
Конечно можно смотреть в обработчике на тип ошибки и не бросать исключение при Notice.
Блин... я даже не знаю, что лучше. Наверно все же лучше проверять по старинке через if...else
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
OrmaJever
Отправлено: 09 Марта, 2014 - 20:29:10
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Hapson пишет:
То есть Notice может прервать скрипт.
да, сам уже понял, но над этим нужно подумать
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Мелкий
Отправлено: 09 Марта, 2014 - 20:45:29
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Hapson пишет:
То есть Notice может прервать скрипт.
И это правильно.
Notice - значит что-то уже пошло не так. И в большинстве случаев лучшее, что при этом можно сделать - отметиться в логе и сдохнуть.
----- PostgreSQL DBA
Hapson
Отправлено: 09 Марта, 2014 - 21:03:24
Посетитель
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
Мелкий пишет:
Hapson пишет:
То есть Notice может прервать скрипт.
И это правильно.
Notice - значит что-то уже пошло не так. И в большинстве случаев лучшее, что при этом можно сделать - отметиться в логе и сдохнуть.
Вобщем-то да, при нормальной работе Notice не вылазит. А тот кусок где ожидается Notice можно обернуть в try...catch
Например установка переменных из $_POST. Чем каждое поле проверять на isset и !empty, лучше обернуть все в try, а в catch переадресовать юзера
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
OrmaJever
Отправлено: 09 Марта, 2014 - 22:04:31
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
хотя вот сидел я смотрел на свой код и понял что бессмысленно в обработчике ошибок кидать исключение.
Ну вот давайте подумаем когда может (в продакшене) вылезть нотис или варнинг? Если скрипт правильно написано то ошибки вылезти просто не могут, и соответственно забивать скрипт кучей try - catch блоков ради непонятно какой ошибки как то дико. А если вдруг предположить что я мог что-то упустить и нотис всё таки вылезет то можно просто в обработчике ошибок его записать в файл и идти дальше.
Если я не прав - поправьте.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
DelphinPRO
Отправлено: 09 Марта, 2014 - 22:32:17
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
OrmaJever пишет:
А если вдруг предположить что я мог что-то упустить и нотис всё таки вылезет то можно просто в обработчике ошибок его записать в файл и идти дальше.
и все, никаких нотайсов. И так везде, где возможен "Undefined variable" ...
Золотое правило: Инициализируйте переменные перед использованием, хоть язык этого и не требует в обязательном порядке.
----- Чем больше узнаю, тем больше я не знаю.
Hapson
Отправлено: 09 Марта, 2014 - 22:37:23
Посетитель
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
OrmaJever пишет:
хотя вот сидел я смотрел на свой код и понял что бессмысленно в обработчике ошибок кидать исключение.
Ну вот давайте подумаем когда может (в продакшене) вылезть нотис или варнинг? Если скрипт правильно написано то ошибки вылезти просто не могут, и соответственно забивать скрипт кучей try - catch блоков ради непонятно какой ошибки как то дико. А если вдруг предположить что я мог что-то упустить и нотис всё таки вылезет то можно просто в обработчике ошибок его записать в файл и идти дальше.
Если я не прав - поправьте.
Ну да, исключения и ошибки все же разные вещи.
DelphinPRO пишет:
Вот неудачный ты пример выбрал. Совсем неудачный.
Ну почему, удачный.
Я так и делаю в принципе. Либо через isset проверяю, либо сразу инициализирую массив с полями для возврата в форму.
Просто хотелось красивее и проще, но не получилось.
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
OrmaJever
Отправлено: 09 Марта, 2014 - 23:13:02
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
по-моему я сейчас построил очередной велосипед, но он мне блин нравится!
Называется он "скажем нет нотайсам от GET и POST"
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Hapson
Отправлено: 09 Марта, 2014 - 23:48:37
Посетитель
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
Чет я не понял, почему методы вызываются автоматически..?
Работает, но непонятно как. Просматривал выполнение пошагово - как они вызываются сами? (Добавление)
Да, и при запросе наверно лучше устанавливать null , а не пустую строку.
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
DelphinPRO
Отправлено: 10 Марта, 2014 - 00:17:23
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Чет я не понял, почему методы вызываются автоматически..?
фишка с том, что $_POST после такой операции - объект, реализующий интерфейс ArrayAccess.
При обращении к такому объекту, как к массиву, автоматически вызываются предопределенные методы интерфейса.
----- Чем больше узнаю, тем больше я не знаю.
Ch_chov
Отправлено: 10 Марта, 2014 - 05:42:42
Постоянный участник
Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008 Откуда: из города
Помог: 90 раз(а)
OrmaJever пишет:
по-моему я сейчас построил очередной велосипед, но он мне блин нравится!
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Ch_chov
но у них это 1854 строки ;) Против моих 30 он не попрёт)))
Hapson пишет:
Работает, но непонятно как.
Магия (Добавление)
DelphinPRO пишет:
$var = $_POST['var'] ?: 'defaultValue';
вот и пригодился этот ненужный оператор!
Единственная проблема это print_r($_GET) выводит не чистый масив, а с ненужной информацией об обьекте
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
esterio
Отправлено: 10 Марта, 2014 - 17:12:45
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
а что будет если $_POST['TestModel']['id'], которого не существует? Нужно еще маггический isset прикрутить и иттератор и сеттер и геттер, вот и получиться 1000 с лишним строк с кучей маггии
DelphinPRO
Отправлено: 10 Марта, 2014 - 18:39:14
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
OrmaJever пишет:
Единственная проблема это print_r($_GET) выводит не чистый масив, а с ненужной информацией об обьекте
какая же это проблема? релизуй магик __toString() в своем реквесте
----- Чем больше узнаю, тем больше я не знаю.
OrmaJever
Отправлено: 10 Марта, 2014 - 18:39:35
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
esterio пишет:
а что будет если $_POST['TestModel']['id'], которого не существует?
но ведь обращение к ['id'] это уже не обращение к объекту request. Объект request вернул массив, а дальше сами. Я же не могу заменить все массивы в скрипте, это сделано только для глобальных. Да и всё равно это плюс, хотя бы в том что как показал DelphinPRO этот класс оживляет мёртвый оператор ?: (Добавление)
DelphinPRO пишет:
какая же это проблема? релизуй магик __toString() в своем реквесте
ага! сам попробуй)) Я об этом подумал в первую очередь, но __toString() должен возвращать только строку, никаких массивов. Как вариант можно конечно реализовать __invoke() и будет print_R($_GET()), но это уже не то, т.к. отходим от стандартного синтаксиса
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.