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

    +165

    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
    class cSG5DataException ... {
        cSG5DataException(CTstatus Status, CTsymbol Error,
                          CTsymbol SubError, std::string Description, ...)
       {
         /* форматирование сообщения */
       }
       /* виртуальный деструктор наличиствует */
    };
    
    class cExcKVSDuplicateKey : public cSG5DataException  {
     /* пусто */
    };
    
    /* код */
    
        throw (cExcKVSDuplicateKey*) new cSG5DataException( CT_statusFail,
                                                            CT_errorObjectExists,
                                                            CT_errorObjectExists,
         "cKVSet_STL_map::insert( CTint k, Value& v ), %d is already in the map",k);

    вот так хитро народ обходит проблему писания конструкторов. темплейт фактори функцию сделать не догадались. но С-style конверсию типов - пожалуйста. мне честно говоря и сложно то себе представить что это как-то работать может. смена типа поинтера то на тип объекта не влияет.

    Запостил: Dummy00001, 14 Февраля 2011

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

    • А оно ловится именно как cExcKVSDuplicateKey? Ух ты...
      Ответить
      • в паре мест пытаются. но я не уверен что это кто-то тестировал и почти везде где эта cExcKVSDuplicateKey она перебрасывается как cSG5DataException... например:

        [code=c++]

        try {
        sectionBlock->insert(KeysK, *section);
        } catch (cExcKVSDuplicateKey* eKvset) {
        delete eKvset;
        throw new cSG5DataException(CT_statusFail,
        CT_errorSystem,
        CT_errorSystem,
        "Config->GetAll: Error during insert section pointer into kvset."
        "\n file: %s", m_file->getName().c_str()
        );
        }
        [code]

        Вот тот `delete eKvset;` тоже говно уже само по себе. бросить new'ed эксепшн из тривиальной функции, словить его, delete его, и new'кнуть новый почти такой же эксепшн и его еще раз бросить.

        RFC1925, пункт 6а рулит.
        Ответить

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