Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
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 конверсию типов - пожалуйста. мне честно говоря и сложно то себе представить что это как-то работать может. смена типа поинтера то на тип объекта не влияет.
в паре мест пытаются. но я не уверен что это кто-то тестировал и почти везде где эта cExcKVSDuplicateKey она перебрасывается как cSG5DataException... например:
Вот тот `delete eKvset;` тоже говно уже само по себе. бросить new'ed эксепшн из тривиальной функции, словить его, delete его, и new'кнуть новый почти такой же эксепшн и его еще раз бросить.
[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а рулит.