Re: Re: Зачем надо throw new CMyException
От: sev http://www.demoforge.com
Дата: 11.03.03 19:44
Оценка:
Приветствую!

> На вопрос, как нужно выбрасывать исключения, есть два мнения:

> 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.