"PHP" / Говнокод #20157 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 zenn1989, (Updated )

Комментарии (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() никакой ошибки не указывает/дает кривой код. потому что внутри сискалл, винапи ошибку обрабатывает, и код обработки затирает нужную "последнюю ошибку".

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

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8