Приветствую!
> На вопрос, как нужно выбрасывать исключения, есть два мнения:
> 1) throw CMyException(...)
> 2) throw new CMyException(...)
[...skipped...]
> Второй подход вроде как хуже из-за дополнительной необходимости удалять
> исключение. Или это фича?
> Бойцы, у кого какое мнение?
Замечательный вопрос. Я буквально на днях всерьёз озаботился этой проблемой.
После некоторых раздумий я реализовал решение, коим весьма теперь доволен.
Все проблемы с автоматическим удалением исключения в нём решены, а также
добавлена возможность "вложенности" исключений в стиле .NET.
Решение можно посмотреть в исходном тексте вот здесь:
http://www.demoforge.com/misc/SmartExceptions.h
А ниже показано, как это решение работает "в жизни".
void ThrowingFunc()
{
throw CSystemExceptionPtr(new CSystemException(E_FAIL));
}
void LibraryFunc()
{
try
{
ThrowingFunc();
}
catch (CExceptionPtr& e)
{
throw CLibraryExceptionPtr(new CLibraryException("Algorithm
failed.",e));
}
}
void UserFunc()
{
try
{
LibraryFunc();
}
catch (CExceptionPtr& e)
{
CException* pe = e.get();
while (pe)
{
printf("%s", pe->GetMessage()); // выводим стек ошибок
pe = pe->GetInnerException();
}
}
}
Самое главное, что код абсолютно безопасен (я так думаю во всяком случае

в плане возможных утечек памяти. Т.е. не напрягаясь делаем new, и не вспоминаем
о delete

Что принципиально отличает это решение от того, что есть в MFC.
Также мы можем свободно передавать исключения из потока в поток, т.е. для этого
их не нужно клонировать
Теперь минусы: единственным отрицательным моментом, на мой взгляд, является
то, что для каждого нового класса исключений нужно не забыть сделать один
дополнительный typedef, благодаря которому появляется возможность пользоваться
приведением к базовому классу в catch. В вышеприведённом коде видно, что мы
ловим более абстрактное исключение, чем выбросили.
Любые усовершенствования приветствуются
С уважением,
Евгений Суходолин
http://www.demoforge.com/Posted via RSDN NNTP Server 1.4.6 beta