1. C++ / Говнокод #5623

    +175

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    template<class Exception>
    bool GenerateException(const Exception* const e)
    {
    	throw e;
    	delete e;
    	return true;
    }

    Продолжение цикла говнокодов про исключения из того же самого проекта.
    Проблем от неё почти нет, тк в основном исключения генерятся так:

    ExceptionТакойто e;
    GenerateException(&e);

    Запостил: Говногость, 10 Февраля 2011

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

    • Исключительная каша в мозгах.
      Ответить
    • достаточно оригинальный подход. хотя и совершенно ненужный
      Ответить
    • Здесь лишнее:
      delete e;
      return true;
      Ответить
      • дополнительный пакетик лапши никогда не бывает лишним!
        Ответить
    • Простите, что значит "проблем от неё почти нет"? Исключение, как понял, объявляется как локальный объект, а потом бросается "по указателю". Если ловец исключения сидит снаружи, то поймает он указатель на уже уничтоженный объект (ибо стек уже развернут). Т.е. работать это в принципе не может вообще и проблем от этого будет много и сразу.

      А если это как-то работает, то только засчет того, что ловец исключения не доступается к "нутру" пойманного "по указателю" объекта. Т.е. причина "работоспособности" тут не в том, как исключение бросается, а в том, как оно ловится.
      Ответить
      • Плюсую. Видимо не используют внутренности исключения. Просто ловят факт появления исключения.
        Или деструктор вызывается, но критического ничего не удаляет, что дальше позволяет использовать память удаленного объекта, как ещё целый.
        Ответить
        • По крайней мере стандартные исключения содержат в себе строку-описание и имеют нетривиальный деструктор. Так что "работает" оно только по недосмотру и капризу компилятора.
          Ответить
          • Возможно здесь стандартные исключения и не используются, тк template<class Exception> - это шаблон, а значит, возможно, генерируемые исключения не наследуются от стандартных std::exception.
            Ответить
            • Предполагать-то всё можно, даже то, что этот код нигде не используется (и только это его и оправдывает). Какой смысл бросать указатель в качестве исключения, а не нормальный наследник std::exception? Какой смысл в этой обёртке вместо простого throw? Никакого.
              Ответить
              • Вы меня спрашиваете? Это вопросы к автору кода. Я с Вами полностью согласен.
                Ответить
          • Тут вполне могут использовать даже инстанц шаблона:
            bool GenerateException(const int* const e)
            Мы по коду узнать это здесь не можем.
            Ответить

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