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
Форумы портала PHP.SU :: Версия для печати :: Вынос обработки исключения в декоратор
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Вынос обработки исключения в декоратор

Страниц (1): [1]
 

1. spsu - 25 Апреля, 2013 - 19:11:43 - перейти к сообщению
Есть класс A который бросает 2 типа исключений , он использует класс B который тоже 2 исключения бросает.
Есть класс C который использует класс A.
В классе C почти все методы класса вызывают методы классса A.
Обработка некоторых исключений идентична в нескольких методах класса С.
Дабы не плодить повторяющийся код, хочу создать декоратор к классу A который будет ловить его исключения и обрабатывать.
Насколько это правильно?
2. caballero - 25 Апреля, 2013 - 20:38:47 - перейти к сообщению
писать декоратор который ловит исключения - звучит как бред сивой кобылы

try блок должен охватывать весь кусок кода
какой смысл вообще кидать исключения в методах классов и тут же их обрабатывать.

я конечно понимаю что писать с ООП - круто, но бессмысленное нагромождение классов к ООП никакого отношения не имеет.
3. spsu - 25 Апреля, 2013 - 21:08:08 - перейти к сообщению
Есть класс HttpClient он брасает два типа исключений, CurlExaption ошибка поражденная curl есть, HttpExcaption бросается если получен HTTP код отличный от 200 и других допустимых.
Есть класс VK который бросает VkApiExcaption который бросается если возникла ошибки VK API есть VkExcaption который бросается в случае внутренних ошибок класса Vk.
VK соответсвенно имеет несколько методов для авторизации, вызова API.
Соответсвенно каждый метод оборачивается в try catch при вызове.
Произошла допустим ошибка vk api выводим сообщения в зависимости от ее кода.
И места в котором она вылезла.
Или например получен Http код 502 значит сервер подвис нужно повторить операцию а не давать сообщение о ошибке.
И.т.д...
Весь код оборачивать не оч. практично.
4. LIME - 25 Апреля, 2013 - 21:17:06 - перейти к сообщению
так могут быть вложенные try catch
и ловить они будут только исключения своего типа либо пробрасывать их дальше
5. spsu - 25 Апреля, 2013 - 21:55:27 - перейти к сообщению
LIME пишет:
так могут быть вложенные try catch
и ловить они будут только исключения своего типа либо пробрасывать их дальше

Зачем тут вложенные или я чего-то не понимаю?
Или имеется введу один глобальный для всех которые не обрабатываются, и вложенны для тех которые обрабатываются?
6. LIME - 25 Апреля, 2013 - 22:05:57 - перейти к сообщению
внешний try выводит сообщения
внутренний (у метода) может повторить попытку либо выбросить сообщение для внешнего
7. spsu - 25 Апреля, 2013 - 22:34:25 - перейти к сообщению
М.б кому поможет несколько статей по использованию исключений в PHP и вообще их использования:
Как делать надо и не надо, http://wiki[dot]agiledev[dot]ru/doku.php[dot][dot][dot]:exception_using
Использование:
http://habrahabr[dot]ru/post/58702/
http://habrahabr[dot]ru/post/58687/
http://habrahabr[dot]ru/post/100137/
Сделаю как написал LIME.
8. DeepVarvar - 25 Апреля, 2013 - 22:51:20 - перейти к сообщению
caballero пишет:
я конечно понимаю что писать с ООП - круто, но бессмысленное нагромождение классов к ООП никакого отношения не имеет.
+100500!
LIME пишет:
вложенные try catch
Зачем?
spsu пишет:
каждый метод оборачивается в try catch при вызове
Давайте еще определение каждой переменной обернем. Шоп наверняка. Шоп никогда приложение не падало. Ни при каких обстоятельствах.
spsu пишет:
М.б кому поможет
Ты так написал, будто это не ты спрашивал, а у тебя.
Лови конкретный ответ на свой вопрос:
PHP:
скопировать код в буфер обмена
  1. try {
  2.   // working
  3. } catch (Exception $e) {
  4.   switch(true) {
  5.     case ($e instanceof yourException1):
  6.       // foo
  7.     break;
  8.     case ($e instanceof yourException2):
  9.       // bar
  10.     break;
  11.     case ($e instanceof yourExceptionN):
  12.       // bazz
  13.     break;
  14.   }
  15. }

Перед тем как запостить этот ответ, я не поленился зайти по всем ссылкам.
На вкус и цвет... фломастеры разные.. И нигде не было примера под твою задачу.
Пользуйся.
9. LIME - 25 Апреля, 2013 - 23:00:54 - перейти к сообщению
DeepVarvar пишет:
Зачем?
тут исключение можно бросить после 25й безуспешной попытки...но вложенность тут возможно и не нужна
DeepVarvar а зачем тут свитч?
можно несколько кэтчей один за другим перечислить с разными типами исключений
сработает подходящий
10. spsu - 25 Апреля, 2013 - 23:30:41 - перейти к сообщению
DeepVarvar , по одно из ссылок было как раз описано что так делать не стоит.
И я с этим мнением полностью согласен.
Зачем свич если можно сделать несколько блоков Catch.
Цитата:
Давайте еще определение каждой переменной обернем. Шоп наверняка. Шоп никогда приложение не падало. Ни при каких обстоятельствах.

Приложения должно быть стабильным.
11. LIME - 25 Апреля, 2013 - 23:53:40 - перейти к сообщению
spsu пишет:
по одно из ссылок было как раз описано что так делать не стоит.
там имелось ввиду другое
хранение признака внутри исключения вместо выброса разных типов

 

Powered by ExBB FM 1.0 RC1