![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
GKosh |
|
||||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Репутация: нет Всего: нет |
Вот как выглядит is_alife():
Когда проект компелировался в VC++ 2003 как Empty Project (.NET), catch благополучно перехватывал исключение, после того как проект был переделан в Win32 Project - в дебаг версии catch срабатывал в 90%, в оставшихся выкидывалась ошибка (в самом try {} блоке). В релиз-версии ошибка появляется каждый раз - try catch не работает! В MSDN что-то пишут про разные версии механизма исключений в VS: "The Win32 structured exception-handling mechanism works with both C and C++ source files. However, it is not specifically designed for C++. You can ensure that your code is more portable by using C++ exception handling." Однако, не ясно что именно нужно сделать, чтобы "using C++ exception handling". Думаю, что дебаг-версия добавляет собственные проверки, почему try-catch все таки в ней иногда работает, но почему он не работает в release? |
||||
|
|||||
GKosh |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Репутация: нет Всего: нет |
Почитал повнимательней - это и есть try catch ![]() |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 1 Всего: 14 |
1. Вначале создай объект прежде чем с ним работать.
2. А где ты собственно исключение кидаешь? -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 10 Всего: 146 |
используй __try и __except
Это сообщение отредактировал(а) 586 - 21.7.2006, 12:21 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Именно. Это называется "неопределенное поведение" - то что в по-разному собранных проектах по-разному работает. Механизм перехвата исключений, к сожалению, идиотские ошибки ловит не гарантированно. __try\__except - это как раз и есть "structured exception-handling mechanism". Не стандартно - только для Windows. Да и не удобно (по сравнению с языковым try\catch). -------------------- ... |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Кинь полный код без многоточия
![]() |
|||
|
||||
GKosh |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Репутация: нет Всего: нет |
XenonSk,
Не так-то просто вырвать кусок кода из большой программы, чтобы она оказался "целым", ну вот листинг проблемы:
Вот командная строка компилятора: /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /EHsc /ML /GS /Fo"Release/" /Fd"Release/vc70.pdb" /W3 /nologo /c /Wp64 /Zi /TP Обратите внимание /EHsc => С++ исключения включены. Вот что выдает запуск программы: Unhandled exception at 0x0040102e in 123.exe: 0xC0000005: Access violation reading location 0x00000022. То есть catch не срабатывает. Если убрать из командной строки /EHsc - все работает как положено - исключение catch'ем перехватывается и приложение завершается корректно. Все это - в релизном билде (дебаг ведет себя немного иначе). Создается впечатление, что C++ EH-механизм способен перехватывать не 100% Win32 исключений. Вообщем, что-то я запутался. С одной стороны MSDN утверждает, что С++ EH - это хорошо, а Win32 EH - плохо, утверждает, что /EHsc опция позволяет try catch работать заодно и как _try _except, а вот _try _except так не может. Получается наоборот при отключенной C++ EH try catch стабильно ловит исключения. Вопрос №2 - кто вызывает исключения? в Win32 - это похоже инструкции, в C++ - функции, тогда какие исключения генерятся в моем проекте? Раз у меня Win32 Project - то это скорее всего ассинхронные Win32 исключения, есть ли тогда в MSVС 2003 возможность создавать НЕ .NET проекты которые создавали бы C++ исключения? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
А разве Access Violation перехватывается с помощью try/catch?
Что-то давно под Windows ничего не писал... |
|||
|
||||
ptr |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 1 Всего: 14 |
В MSVC можно включить отлавливание.
Всё правильно, нужно сначала создать объект (IObject* link = new IObject()). Кто тебе сказал, что так положено.
А он и не должен перехватывать Win32 исключения. Ты путаешь системные исключения win32 (access violation, divide-by-zero, и т.д) и языковые ислючения. Создавай обычный проект и кидай в нем искючения сколько душе захочется. В твоей же программе есть ошибка, поэтому и access violation прилетает. -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |