![]() |
|
Модераторы: bsa |
![]()
|
|
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
доходит
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Не доходит до деструктора Obj1 потому что ломается на поиске соотвествующего catch. Тот, что есть, не ловит, так как наследование Exc1 от BaseExc приватное, и приведение типов в ловушке не производится.
Напиши
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
Добавлено через 14 секунд код не менял |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Код не менял -
Код менял -
Студия 2003 PS. У тебя вообще поддержка исключений включена? Это сообщение отредактировал(а) xvr - 5.7.2009, 00:32 |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
включена - /EHsc студия - 2008 |
|||
|
||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
MSVC 2008 ругается
warning C4722: 'Obj1::~Obj1' : destructor never returns, potential memory leak код не менял, доходит только до Exc1() исключения включены - /EHsc *** gcc тоже только до Ex1 доходит Это сообщение отредактировал(а) zim22 - 5.7.2009, 11:35 |
||||
|
|||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
'Аналогичн' © Следствие ведут Колобки Lazin колись, почему у тебя доходит Уж до ~ObjMain() по любому доходить не должно - исключение из деструктора Obj1 должно было срубить программу раньше однозначно! Если еще закоментировать throw Exc2(); в деструкторе Obj1 и добавить ключ /GR при компиляции (для поддержки RTTI), то получим
|
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Возможно, я компилировал с коммандной строки, там она по умолчанию не включена |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Читая дальше Страуструпа про "Спецификации исключений", обнаружил еще одно непонятное явление:
Вопрос, в F2 сказано что генирит только и только Exc2 , но в F1, которую она вызывает генерится Exc1 , так почему не вызывается unexpected() ? --- Гы, а сейчас вызывается этот unexpected() , только почему не вызывался, не пойму! Использую MS Visual Studio 2008 TS Это сообщение отредактировал(а) EvilsInterrupt - 6.7.2009, 12:16 |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
компилятор студии ведет себя здесь не так как положено по стандарту, если ф-я имеет не пустую спецификацию исключений, то она может кидать любое исключение и unexpected не вызовется, нормально работают только пустые спецификации исключений
|
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Продолжаю эксперементировать дальше, стандарт по С++ говорит что std::exception это базовый класс. Для меня базовый это тот класс, реализацию которого осуществляют в потомках, но вот есть код:
В этом коде, объект std::exception успешно создается! Но почему ? Если этот базовый, то не должно ведь! |
|||
|
||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Попробуй это собрать на компиляторе, который более соответствует стандарту:
Добавлено через 1 минуту и 6 секунд EvilsInterrupt, пользуйся std::runtime_error или другими стандартными исключениями, если они тебе подходят. Добавлено через 7 минут и 42 секунды
В корне не верное утверждение. Базовый - это класс, который был унаследован. И не важно, реализует ли наследник что-то или нет. Существует понятие абстрактного класса - класс, у которого хотя бы один метод объявлен абстрактным (реализация может присутствовать). Нельзя создать экземпляр подобного класса. Можно создать только экземпляр потомка, который реализует (наследует реализацию) всех абстрактных методов. |
||||||
|
|||||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
bsa,
Да я еще думаю над вопросом "А что мне подходит ?" ;) 1) Хочу ловить разнообразные bad_alloc, ну и др. полезные исключения, а это означет использование потомков exception или насколько понял std::exception, пока еще не понял в чем их различие. 2) Насколько понимаю есть, которые произошли не по вине программы, к примеру сеть обрубили или свет выключили и коннекта с модемом нет и это runtime_error, а есть логические, к примеру некорректно вычислилась зарплата и введено большое входнойчисло, а на старте процесса вычисления невозможно было сразу проверить, тогда это logic_error но что делать если ошибки такие: - открытие файла - создание файла - чтение из файла - запись в файл - выделение памяти для внутреннего кэша Казалось бы все они логические, но разве от программы зависит открытие файла ? Это операционка решает открыть или нет! |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Пока пришел к выводу, что на каждую систему, читай библиотеку надо создавать свой базовый класс исключений. В данном случае, что писывал для системы IOlib нужно создать базовый:
class error_iolib : public std::exception; а уж от error_iolib порождать error_io_read, error_io_write, etc , даже не смотнря нато что ошибка при выделении буфера близка к bad_alloc , все равно лучше создать error_io_cashe . Думаю такой подход не нарушит концептуальной целостности библиотеки и будет понятно, что к чему относится. Вообще, хочется знать у кого какие мысли и опыт в построении иерархий исключений для библиотек. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |