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

    +5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    <?
    if($login=='')
    {
       global $APPLICATION;
       $APPLICATION->ThrowException('Имя входа должно быть заполнено.'); 
       return false;
    }
    
    // Получить последнее исключение можно методом 
    $APPLICATION->GetException()
    ?>

    Bitrix. Лучшие стандарты веб-разработки и новое ядро! Создатели логики try-catch-throw наверное перевернулись бы 100500 раз в гробу увидев такую "реализацию". Пруф как "нужно делать": https://dev.1c-bitrix.ru/api_help/main/reference/cmain/throwexception.php

    Запостил: zenn1989, 08 Июня 2016

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

    • Из документации трудно понять, как это должно работать. По сути это не исключение, а просто отправка сообщения об ошибке, которое потом можно забрать и проанализировать? Что-то типа этого:
      https://habrahabr.ru/company/piter/blog/270331/

      Или я ошибся?
      Ответить
      • В битриксе вообще сложно что-либо понять ... Скорей всего вы правы, но почему не сделать это по-человечески:
        try {
            // инициируй там че хочешь
            $instance = new SomeClass($params);
            $instance->run();
        } catch (Exception $e) {
            // лови и обрабатывай свои сообщения из ошибок ... 
            $msg = $e->getMessage();
        }
        ... 
        class SomeClass
        {
            private $data;
            public function __construct($data)
            {
                $this->data = $data;
            }
        
            public function run()
            {
                // выбрасывай ошибки с сообщениями
                throw new Exception('Какое то там сообщение об ошибке');
            }
        }
        Ответить
    • > $APPLICATION->GetException()
      Повеяло запашком GetLastError().
      Ответить
      • И главное, что только Last. Предпоследнюю ошибку мы вытащить не сможем.
        Ответить
        • ну для кодовозвратной идеологии это норма, по дефолту есть только последняя ошибка, которую и нужно обрабатывать, предпоследняя ошибка не нужна
          Ответить
          • Объект $APPLICATION у нас глобальный. Допустим, у нас есть такой фрагмент кода:
            $y = FirstFunction() + SecondFunction();

            Сгенерировать ошибку могут обе функции, а проверить мы сможем только одну.
            Ответить
            • ну тут ошибка в том, что в качестве яп выбрано пхп что нужно использовать исключения, а не проверять последнюю ошибку

              изначально речь была про GetLastError, а там где есть этот самый GetLastError было бы что то типа
              x = FirstFunction();
              if (x == -1)
                  return -1;
              y = SecondFunction();
              if (y == -1)
                  return -1;
              y +=x;

              то, что в принципе оба варианта не очень, это уже другая история
              Ответить
          • Забавно что обычно как раз важна первая ошибка, а не последняя в цепочке неделимых действий
            Ответить
            • пример "цепочки неделимых действий"?
              Ответить
              • Подозреваю, что LispGovno имел ввиду что-то наподобие такого:
                FILE *f = fopen(...);
                fread(f, ...);
                fclose(f);

                Очевидно, что если у нас зафейлится fopen, нам нужна именно ошибка fopen'a, а не всякие там "Bad descriptor" от fclose.
                Ответить
                • да. это частая ошибка в винапи: сискалл обламывается, но GetLastError() никакой ошибки не указывает/дает кривой код. потому что внутри сискалл, винапи ошибку обрабатывает, и код обработки затирает нужную "последнюю ошибку".

                  теже яйца на линухах - но там сискаллов меньше и они глубже тестируются. поэтому на такие ошибки еще не спотыкался. (по правде говоря - на виндах сам не спотыкался, а коллеги.)
                  Ответить
                • Надо стэк кодов ошибок держать на такой случай.
                  Ответить
                • ага, и что не так?
                  https://snag.gy/9jMduR.jpg
                  Ответить
                  • >> "цепочки неделимых действий"
                    Dummy00001 выше уже более корректный пример привёл.
                    Ответить
                    • хз, я с таким не встречался, но так понимаю это уже ошибка дизайна в чужом коде, не проверять успешность fopen в своем коде это ссзб, а не "цепочка неделимых действий"
                      Ответить
                      • > не проверять успешность fopen в своем коде это ссзб, а не "цепочка неделимых действий"
                        Что вы привязались к моему fopen? Это - концепт, иллюстрация. Никто и не говорит, что fopen-fread-fclose - это неделимая цепочка.
                        Ответить
                        • ну я просто попросил конкретный пример, хотя вот сейчас что то вспомнилось, что при использовании OpenSSL вроде бы сталкивался с чем то подобным
                          Ответить

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