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

    +17

    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
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    std::string sError = "";
    try
    {
       fIn = fopen(cszFileName, "rb");
       if (fIn == 0)
       {
         sError = "Can not open file: ";
         sError += cszFileName;
         throw std::string("");
       }
    
       if (!ParseFile(fIn, pLookup))
       {
         sError = "Bad file format. File: ";
         sError += cszFileName;
         throw std::string("");
       }
    
       sError = "";
       throw std::string("");
    }
    catch (std::string& e)
    {
       if (fIn != 0)
       {
          fclose(fIn);
          fIn = NULL;
       }
       if (sError.length() != 0)
       {
          throw std::exception(sError.c_str());
       }
    }

    Там же нашел еще более шикарное продолжение гавнокода http://govnokod.ru/1459

    Запостил: lugal, 12 Августа 2009

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

    • Диагноз ясен - говнокодер перевоспитанию не поддаётся. Тем более, учитывая его почтенный (по меркам IT) возраст.
      Ответить
    • Я в С++ не понимаю нифига. Он бросал ексепцию и передавал текст ошибки через стороннюю переменную? Он не использовал разные классы для разных ситуаций? В самом конце бросил ексепцию и не поймал? Или чё ваще?
      Ответить
      • Ну в общем по пунктам:
        1 - текст сообщения о ошибке передавался строковой переменной.
        2 - Исключенпие бросалось совершенно левого формата.
        3 - даже при нармальном завершении участка кода бросалось исключение, видимо, для "рационализации" закрытия файла.
        4 - И наконец таки если ошибка все же происходила, то потом таки выбрасывалось исключени с "человеческим лицом"
        Ответить
        • Ха, почти угадал. Человеку писавшему этот "код" стоит задуматься...
          Ответить
        • еще один пункт - сообщение об ошибке хранится то в переменной, то передается через эксепшн
          Ответить
    • Круто он аргумент передает несуществующему конструктору абстрактного класса std::exception да еще с параметром c_str() указывающим на текст ошибки адрес которого будет недействителен при выбросе исключения за пределы блока (если конечно стринг не глобальный). Представляю как по-кайфу другим ловить такие исключения снаружи, особенно пытаясь узнать e.what()? :D
      И скомпилировалось же...

      namespace std
      {
      class exception
      {
      public:
      exception() throw() { }
      virtual ~exception() throw();
      virtual const char* what() const throw();
      };
      Ответить
      • ХМ специально проверил. В 2003 студии. std::exception есть, один из его конструкторов действительно принимает char*, и сохраняет его локально в нутри, тоесть изменение контента стринги, переданной в конструктор, после выброса экзепшена, но до вызова .what() не изменяет первоночального текста.
        Ответить

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