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 Ошибки и Исключения
Ситуация такая: юзер открывает firebug, удаляет поле password и отправляет форму.
Я наивно полагал, что сработает блок catch, так как в массиве $_POST не будет поля password. Однако получил Notice и не попал в catch.
Отсюда вопрос: что такое исключение и как перехватить ошибки в блоке try?
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
OrmaJever
Отправлено: 09 Марта, 2014 - 13:43:29
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
пользу исключений не показать на примере "Hello World", что бы понять их принцип нужно много кода.
Вкратце: исключения сделаны для того что бы избежать цепную реакцию, то есть когда в коде произошла ошибка, вы кидаете исключение и весь код от throw до catch выполнятся не будет, тем самым избавляя вас от кучи ошибок.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Hapson
Отправлено: 09 Марта, 2014 - 13:54:29
Посетитель
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
OrmaJever пишет:
то есть когда в коде произошла ошибка, вы кидаете исключение
Ну вот ошибка и произошла, но catch не сработал, так как он не реагирует на ошибки.
Это что получается, код должен выглядеть так:
Не понимаю...
Или чтобы ловить ошибки нужно писать свой обработчик ошибок и уже в нем обрабатывать ошибку, а затем вызывать throw new ErrorException() ?
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
OrmaJever
Отправлено: 09 Марта, 2014 - 14:05:02
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Hapson пишет:
Ну вот ошибка и произошла, но catch не сработал, так как он не реагирует на ошибки.
Да, я тоже считаю что перед тем как показывать notice или warning, ядро должно кинуть исключение, но разработчики мои мысли видимо читать не умеют
Hapson пишет:
Это что получается, код должен выглядеть так:
да, в большинстве случаев интерпретатор не знает где по вашем ошибка, он же не знает что когда пустой $_POST['email'] то это ошибка. Поэтому исключения нужно кидать самому.
А отличаются от простых if() {} else {} в том что их можно пробрасывать через не ограниченную вложенность, например.
Таким образом можно по своему обрабатывать ошибки, а также ловить их в блоках try http://www.php.net/manual/ru/cla...rorexception.php (Добавление)
То есть по сути ошибки становятся исключениями, но и ошибками не перестают быть...
как-то так
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
OrmaJever
Отправлено: 09 Марта, 2014 - 14:17:20
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
а как вы ловить его собрались?
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Hapson
Отправлено: 09 Марта, 2014 - 14:23:30
Посетитель
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Если в $_POST чего-то нет, то возникнет Notice, сработает мой обработчик ошибки, в котором бросается исключение, которое можно поймать в catch, если оно нужно конечно.
А можно просто сделать что нужно, например вывести юзеру ошибку.
Короче при ошибках в try сработает catch
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
OrmaJever
Отправлено: 09 Марта, 2014 - 14:29:03
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Hapson пишет:
Если в $_POST чего-то нет, то возникнет Notice, сработает мой обработчик ошибки, в котором бросается исключение, которое можно поймать в catch, если оно нужно конечно.
снимаю шляпу Стыдно конечно, но я о таком подумать не мог (Добавление)
Я думаю эта информация даже изменила мою php'шную жизнь)))
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Hapson
Отправлено: 09 Марта, 2014 - 14:35:14
Посетитель
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
[quote=OrmaJever][/quote]
Да, удобно, но злоупотреблять наверное не стоит.
Конечно если код работает без ошибок, то все ОК. Но если ошибки есть, то каждая ошибка будет генерировать исключение, что накладно. (Добавление)
И если есть @ в коде, то их сразу отсеивать в обработчике через error_reporting()
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
OrmaJever
Отправлено: 09 Марта, 2014 - 19:27:33
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Есть единственный минус, если убрать блок try catch то будет фатал об не пойманом исключении, что немного обидно.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
DelphinPRO
Отправлено: 09 Марта, 2014 - 19:42:03
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
а я через error_handler перехватываю ошибки, а потом кучно списком вывожу в конце страницы, чтобы верстку не ломать, и на headers send by... не нарваться
Кидать исключение, по моему, перебор
----- Чем больше узнаю, тем больше я не знаю.
Ch_chov
Отправлено: 09 Марта, 2014 - 19:49:31
Постоянный участник
Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008 Откуда: из города
Помог: 90 раз(а)
OrmaJever пишет:
если убрать блок try catch то будет фатал об не пойманом исключении, что немного обидно.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.