Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Класс исключения |
Автор: CppDevelopeR 12.10.2008, 17:08 | ||
Написал простенький класс исключения. Вроде написан правильно, но хотелось бы послушать советов более опытных программеров, что оптимизировать можно, что подкорректировать. Вот код:
|
Автор: Cycle 13.10.2008, 09:21 | ||
Если функциональность класса больше не будет развиваться, может проще использовать просто string? А вообще выбрасывание исключения типа string не для чего более, чем для вывода на экран не годится. Попробуй следующий код:
|
Автор: Lycifer 13.10.2008, 09:59 |
Если мнение то это просто : - Класс исключения обязан быт ьнаследникуом от exception из std; - Иметь виртуальный деструктор - Виртуальную функцию которая возврощает сообщения исключения Это всё пиши есчё) |
Автор: Alek86 13.10.2008, 10:32 |
с чего бы это? обоснуй у std::exception это условие не соблюдается в стандарте ошибка? |
Автор: Lazin 13.10.2008, 10:49 | ||
а чем std::exception не устраивает, а так-же std::runtime_error, std::logic_error итд... в своих программах я обычно использую 2 типа исключений, 1-й - после которого объект, метод которого бросил исключение можно использовать, он не потерял целостность, 2-й, после которого объект нельзя использовать.. в результате получается что-то вроде
|
Автор: Mayk 13.10.2008, 10:56 | ||||||
чтобы можно было сделать
можно конечно сделать
правда не ясно нафига. Дай угадаю. наверное чтобы
валилась terminate()'ом из-за необработанного исключения Под рукой стандарта нет. Но в <exception>'е mingw'а деструктор виртуален. Ы? Добавлено @ 11:01 апачевский stdcxx и rougewave excption юзают виртуальный деструктор http://stdcxx.apache.org/doc/stdlibref/exception.html#idx630 http://www2.roguewave.com/support/docs/sourcepro/edition9-update1/html/stdlibref/exception.html (кстати их справки схожи - но разбиратсья кто от кого отпочковался лень) так что если в стд не сказано про вирт деструктор - да, там ошибка. бывает |
Автор: Alek86 13.10.2008, 11:16 | ||
возможно и я проглючил хотя чето упоминания про вирт деструтор в стардарте не вижу свою иерархию, конечно, лучше сделать, но с чего вдруг наследоваться именно от std::exception? |
Автор: J0ker 13.10.2008, 21:25 |
Виртуальность наследуема. У переопределенных методов необязательно указывать virtual - но желательно для удобства последующего наследования |
Автор: UnrealMan 13.10.2008, 22:13 | ||||
Ну, даже не знаю, как тебе и сказать... Короче... в общем... твой класс не безопасен по отношению к исключениям ![]() ![]() (Hint: в течение раскрутки стека объект исключения может копироваться) |
Автор: J0ker 13.10.2008, 22:49 | ||
кстати вот это вот интересный вопрос - нужно ли избегать в обработчиках ошибок использовать всякие сложные объекты которые могут сами вызывать исключения? |
Автор: UnrealMan 13.10.2008, 22:58 |
До выполнения обработчика исключений программа автора может попросту не дожить. |
Автор: Alek86 13.10.2008, 23:10 | ||
стараться нужно но если прога часто использует RAII, то избежать не выйдет |
Автор: J0ker 13.10.2008, 23:11 | ||
ну меня тот-же string в объекте исключения интересует при копировании (как и при создании) будет аллокация которая сама может вызвать исключение так вот вопрос собственно из этого |
Автор: UnrealMan 13.10.2008, 23:18 | ||||
Если исключение произойдёт при копировании, то будет terminate:
|
Автор: J0ker 13.10.2008, 23:38 | ||
это понятно непонятно как к этому относиться с чисто человеческой т.з. все-таки terminate там где ожидалась обработка и, возможно, восстановление от ошибки как-бы не очень кошерно ![]() |
Автор: UnrealMan 13.10.2008, 23:52 | ||
Ну, как бы следует делать копирующий конструктор бессбойным. Для этого достаточно, к примеру, заменить std::string на boost::shared_ptr<std::string>. |
Автор: Mayk 14.10.2008, 05:54 | ||
При стандартном аллакотаре можно считать что исключений в выделений памяти не бывает(см Саттера) |
Автор: J0ker 14.10.2008, 06:33 | ||||
что-то мне мое внутреннее чутье подсказывает что все-таки бывает можно либо точно указать где смотреть либо пересказать своими словами? |
Автор: Lazin 14.10.2008, 07:36 | ||
да можно тупо отнаследовать от std::exception и все |