Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Не срабатывает try catch


Автор: GKosh 21.7.2006, 11:16
Код


 Object* pObject = 0;

    try 
    {
        pObject->is_alife();
    }
    catch ( ... )
    {

                }


Вот как выглядит is_alife():
Код

virtual bool is_alife() { return true; } 


Когда проект компелировался в 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
Цитата

В MSDN что-то пишут про разные версии механизма исключений в VS:


Почитал повнимательней - это и есть try catch smile - не то. 

Автор: ptr 21.7.2006, 12:00
1. Вначале создай объект прежде чем с ним работать.
2. А где ты собственно исключение кидаешь? 

Автор: 586 21.7.2006, 12:12
используй __try и __except 
Код
Object* pObject = 0;
 
 __try
 {
  pObject->is_alife();
 }
 __except(EXCEPTION_EXECUTE_HANDLER)
 {

 }
   

Автор: Earnest 21.7.2006, 15:05
Цитата(ptr @  21.7.2006,  13:00 Найти цитируемый пост)
1. Вначале создай объект прежде чем с ним работать.

Именно. Это называется "неопределенное поведение" - то что в по-разному собранных проектах по-разному работает. 
Механизм перехвата исключений, к сожалению, идиотские ошибки ловит не гарантированно. 
__try\__except - это как раз и есть "structured exception-handling mechanism". Не стандартно - только для Windows. Да и не удобно (по сравнению с языковым try\catch). 

Автор: Xenon 21.7.2006, 15:13
Кинь полный код без многоточия smile 

Автор: GKosh 21.7.2006, 17:23
XenonSk, 
Не так-то просто вырвать кусок кода из большой программы, чтобы она оказался "целым", ну вот листинг проблемы:
Код

#include <windows.h>

class IObject
{
public:
    
    IObject(){}
    virtual ~IObject(){}

    virtual bool is_alife() { return true; } 
};

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{

    IObject* link = 0;

    try
    {
        link->is_alife();
    }
    catch(...)
    {

        return 0;

    }

    return 0;
}


Вот командная строка компилятора:
/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 ничего не писал... 

Автор: ptr 23.7.2006, 11:18
Цитата(bsa @  23.7.2006,  02:24 Найти цитируемый пост)
А разве Access Violation перехватывается с помощью try/catch?

В MSVC можно включить отлавливание.

Цитата(GKosh @  21.7.2006,  21:23 Найти цитируемый пост)
Unhandled exception at 0x0040102e in 123.exe: 0xC0000005: Access violation reading location 0x00000022.

Всё правильно, нужно сначала создать объект (IObject* link = new IObject()).

Цитата(GKosh @  21.7.2006,  21:23 Найти цитируемый пост)
То есть catch не срабатывает. Если убрать из командной строки /EHsc - все работает как положено - исключение catch'ем перехватывается и приложение завершается корректно.

Кто тебе сказал, что так положено.

Цитата(GKosh @  21.7.2006,  21:23 Найти цитируемый пост)
Создается впечатление, что C++ EH-механизм способен перехватывать не 100% Win32 исключений.

А он и не должен перехватывать Win32 исключения.

Цитата(GKosh @  21.7.2006,  21:23 Найти цитируемый пост)
Вопрос №2 - кто вызывает исключения? в Win32 - это похоже инструкции, в C++  - функции, тогда какие исключения генерятся в моем проекте? Раз у меня Win32 Project  - то это скорее всего ассинхронные Win32 исключения, есть ли тогда в MSVС 2003 возможность создавать НЕ .NET проекты которые создавали бы C++ исключения?  

Ты путаешь системные исключения win32 (access violation, divide-by-zero, и т.д) и языковые ислючения. Создавай обычный проект и кидай в нем искючения сколько душе захочется. В твоей же программе есть ошибка, поэтому и access violation прилетает. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)