| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Не срабатывает try catch |
| Автор: GKosh 21.7.2006, 11:16 | ||||
Вот как выглядит 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 21.7.2006, 11:36 | ||
Почитал повнимательней - это и есть try catch |
| Автор: ptr 21.7.2006, 12:00 |
| 1. Вначале создай объект прежде чем с ним работать. 2. А где ты собственно исключение кидаешь? |
| Автор: 586 21.7.2006, 12:12 | ||
используй __try и __except
|
| Автор: Earnest 21.7.2006, 15:05 |
Именно. Это называется "неопределенное поведение" - то что в по-разному собранных проектах по-разному работает. Механизм перехвата исключений, к сожалению, идиотские ошибки ловит не гарантированно. __try\__except - это как раз и есть "structured exception-handling mechanism". Не стандартно - только для Windows. Да и не удобно (по сравнению с языковым try\catch). |
| Автор: Xenon 21.7.2006, 15:13 |
| Кинь полный код без многоточия |
| Автор: GKosh 21.7.2006, 17:23 | ||
| 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 22.7.2006, 22:24 |
| А разве Access Violation перехватывается с помощью try/catch? Что-то давно под Windows ничего не писал... |