Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не срабатывает try catch, простое исключение 
:(
    Опции темы
GKosh
Дата 21.7.2006, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.12.2005

Репутация: нет
Всего: нет



Код


 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? 
PM MAIL   Вверх
GKosh
Дата 21.7.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.12.2005

Репутация: нет
Всего: нет



Цитата

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


Почитал повнимательней - это и есть try catch smile - не то. 
PM MAIL   Вверх
ptr
Дата 21.7.2006, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



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


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
586
Дата 21.7.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



используй __try и __except 
Код
Object* pObject = 0;
 
 __try
 {
  pObject->is_alife();
 }
 __except(EXCEPTION_EXECUTE_HANDLER)
 {

 }
   

Это сообщение отредактировал(а) 586 - 21.7.2006, 12:21
PM   Вверх
Earnest
Дата 21.7.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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

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


--------------------
...
PM   Вверх
Xenon
Дата 21.7.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Кинь полный код без многоточия smile 


--------------------
user posted image  
PM MAIL   Вверх
GKosh
Дата 21.7.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.12.2005

Репутация: нет
Всего: нет



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++ исключения? 
PM MAIL   Вверх
bsa
Дата 22.7.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



А разве Access Violation перехватывается с помощью try/catch?
Что-то давно под Windows ничего не писал... 
PM   Вверх
ptr
Дата 23.7.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



Цитата(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 прилетает. 


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.