1. PHP / Говнокод #6959

    +162

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    public function save() {
            try {
                try {
                    $this->create();
                } catch (Exception $e) {
                    //probably dulplicate
                    $this->update();
                }
            } catch (Exception $e) {
                logger::error($e);
            }
    
        }

    try-catch много не бывает

    Запостил: super, 15 Июня 2011

    Комментарии (23) RSS

    • Логично. А как бы вы сделали?
      Ответить
      • Поскольку, как я понимаю, в PHP все исключения по определению самописные, то ловить нужно было именно то исключение, которое выбрасывется при неудачном сохранении, а не все подряд. Ну и в таком случае try был бы только один. Если это по каким-то причинам не возможно, то все равно, лучше всегда максимально сузить область, в которой может случится ошибка - т.е. вместо "верхнего" try, я бы перенс его над $this->update().
        Ответить
        • Ну, то, что исключение практически наверняка будет именно класса Exception — это проблема PHP (стандартно не определено кучи классов исключений на все случаи жизни, вот никто и не заморачивается). Одним try не обойтись — если вылетит исключение из create, нужно позвать update, а если вылетит и из него — записать в лог. Как именно вкладывать блоки try тоже нет большой разницы, конфетка не получится.
          Ответить
          • А где определено? Покажите хоть один язык? Есть базовые из семейств LogicException и RuntimeException, все, от них и копать, сделать свое исключение не сложно и во всех нормальных библиотеках делаются свои классы исключений, отнаследованные от стандартных.
            Ответить
            • Да везде. В жаве так целый букет разнообразных исключений, и даже в C++ в стандарте определяется более классов десятка исключений (и много говорится о том, как определять свои). А в php только Exception и ErrorException. И 9000 стандартных функций исключения не используют. Откуда ж взяться не каше в голове?
              Ответить
              • Ну если надо кучу, есть такая стандартная библиотечка SPL, в ней есть куча эксепшенов, к примеру есть семейства Logic- и RuntimeException. http://www.php.net/~helly/php/ext/spl/
                Ответить
              • Ответил ниже про spl.
                А вот тут говориться как определять свои эксепшены
                http://ru.php.net/manual/en/language.exceptions.extending.php
                Ответить
          • http://www.php.net/manual/en/spl.exceptions.php (PHP5+)
            К ним же ErrorException
            Ответить
            • Это немного в стороне, вещь достаточно обособленная. Не уверен, что 90% php-истов даже слышали о SPL, не то, что применяют его.
              Ответить
              • Не обособленная и не в стороне.
                spl уже давно включен в стандартную поставку php, начиная ажно с версии 5.0.
                А с версии 5.3 ее даже убрать нельзя во время сборки пхп.
                Ответить
              • Грош цена таким программистам, у меня бы собеседование они не прошли.
                Ответить
                • А кроме собеседования они где-то SPL применяют?
                  Ответить
                  • Применяют ибо очень много заточено под SPL, итераторы, эксепшены очень активно используются.
                    Ответить
    • на мой взгляд, самое правильное здесь решение было бы как-то так:
      class ORMGovno {
      
      private $old;
      
      public function create() {
               try {
                      // необходимый код
                      $this->old=true;
              } catch (Exception $e) {
                  logger::error($e);
              }
      }
      
      public function get() {
               try {
                      // необходимый код
                      $this->old=true;
              } catch (Exception $e) {
                  logger::error($e);
              }
      }
      
      
      
      public function save() {
              try {
                  if($this->old) $this->update(); else $this->create();
              } catch (Exception $e) {
                  logger::error($e);
              }
      }
      
      }
      Ответить
      • если предположить, что $this - это обращение к БД, то проще было бы так:
        public function save()
        {
            if ($_REQUEST['id'] == 0)
                $this->_create();
            elseif ($_REQUEST['id'] != 0)
                $this->_update();
            else
                logger::error('Ашипка!');
        }

        или использование try ... catch обязательно?
        Ответить
        • > $_REQUEST['id'] ==0
          божемой.
          1. откуда в этом слое знание о реквесте? этим должен заниматься слой ввода-вывода
          2. следствие из 1 - несекьюрно
          3. наличие id еще ничего не говорит
          4. зная особенности пхп как динамичного языка, сравнение с нулем одновременно и недостаточно, и избыточно, т.к.
          4.1. id может быть и не установлен вообще (по идее, это и правильно для нового объекта)
          4.2. id может прийти еще и "", и null
          4.+ суммируя, я бы использовал empty()
          Ответить
          • я не сказал правильней, я сказал проще. и я ни в коей мере не пытался улучшить ни Ваш, ни исходный код. лишь упростить до абсурда. *pardon*
            Ответить
        • и, да, подавлять эксепшены в этом слое считаю неправильным.
          у меня бы они вылетали до самого верха, где уже слой вывода их ловил, писал в лог и выдавал бы красивое сообщение об ошибке - в продакшене пару слов, в девел - системное сообщение с полезной инфой (стектрейс, содержимое основных суперглобалов)
          Ответить
          • Вот это — правильно (обычно).
            Ответить
            • ну ничто не мешает при необходимости словить нижнему слою, обработать, и возможно, кинуть дальше.
              Ответить
    • >dulplicate

      видимо он перед этим пил, язык не вяжет
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий