![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
CppDevelopeR |
|
|||
![]() Experienced Expert ![]() ![]() Профиль Группа: Участник Сообщений: 390 Регистрация: 7.1.2008 Где: Moscow-City Репутация: нет Всего: 9 |
Написал простенький класс исключения. Вроде написан правильно, но хотелось бы послушать советов более опытных программеров, что оптимизировать можно, что подкорректировать. Вот код:
|
|||
|
||||
Cycle |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 1.12.2007 Репутация: 3 Всего: 3 |
Если функциональность класса больше не будет развиваться, может проще использовать просто string? А вообще выбрасывание исключения типа string не для чего более, чем для вывода на экран не годится.
Попробуй следующий код:
|
|||
|
||||
Lycifer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 4.11.2007 Репутация: нет Всего: нет |
Если мнение то это просто :
- Класс исключения обязан быт ьнаследникуом от exception из std; - Иметь виртуальный деструктор - Виртуальную функцию которая возврощает сообщения исключения Это всё пиши есчё) |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Правла если всё это сделать с классом в начале сообщения, то получится близнец std::logic_error *crazy*. другой вопрос зачем вообще городить близнеца logic_error'а? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
с чего бы это? обоснуй у std::exception это условие не соблюдается в стандарте ошибка? Это сообщение отредактировал(а) Alek86 - 13.10.2008, 10:44 |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
а чем std::exception не устраивает, а так-же std::runtime_error, std::logic_error итд...
в своих программах я обычно использую 2 типа исключений, 1-й - после которого объект, метод которого бросил исключение можно использовать, он не потерял целостность, 2-й, после которого объект нельзя использовать.. в результате получается что-то вроде
|
|||
|
||||
Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
чтобы можно было сделать
можно конечно сделать
правда не ясно нафига. Дай угадаю. наверное чтобы
валилась terminate()'ом из-за необработанного исключения Под рукой стандарта нет. Но в <exception>'е mingw'а деструктор виртуален. Ы? Добавлено @ 11:01 апачевский stdcxx и rougewave excption юзают виртуальный деструктор http://stdcxx.apache.org/doc/stdlibref/exception.html#idx630 http://www2.roguewave.com/support/docs/sou.../exception.html (кстати их справки схожи - но разбиратсья кто от кого отпочковался лень) так что если в стд не сказано про вирт деструктор - да, там ошибка. бывает Это сообщение отредактировал(а) Mayk - 13.10.2008, 11:06 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
возможно и я проглючил хотя чето упоминания про вирт деструтор в стардарте не вижу свою иерархию, конечно, лучше сделать, но с чего вдруг наследоваться именно от std::exception? Это сообщение отредактировал(а) Alek86 - 13.10.2008, 11:22 |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
Виртуальность наследуема. У переопределенных методов необязательно указывать virtual - но желательно для удобства последующего наследования |
|||
|
||||
UnrealMan |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Ну, даже не знаю, как тебе и сказать... Короче... в общем... твой класс не безопасен по отношению к исключениям ![]() ![]() (Hint: в течение раскрутки стека объект исключения может копироваться) |
||||
|
|||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
||||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
ну меня тот-же string в объекте исключения интересует при копировании (как и при создании) будет аллокация которая сама может вызвать исключение так вот вопрос собственно из этого |
|||
|
||||
UnrealMan |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Если исключение произойдёт при копировании, то будет terminate:
Это сообщение отредактировал(а) UnrealMan - 13.10.2008, 23:22 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |