Процесс вылетает несмотря на try - catch(...)
От: agendus  
Дата: 28.05.10 09:19
Оценка:
Добрый день.
Требуется очередной ликбез на тему обработки исключений.
Вот код, намеренно приводящий к ошибке (процесс вылетает):

iLevel = 0;

BidMap::const_iterator c_Bit = (*c_insBit).second.begin();
while ( iLevel < _depth || c_Bit != (*c_insBit).second.end() )   // условие ИЛИ приводит к тому, что итерация случится, даже если итератор указывает на конец контейнера
        {
// попытка обращения к элементу массива, когда итератор указывает на конец контейнера - ВЫЛЕТ
            double P = (*c_Bit).first;
            
            c_Bit++;
            iLevel++;
        }


Вызов функции, выполняющей этот код, обрамлен блоком try-catch(...), в опциях проекта установлено Enable C++ Exceptions — Yes With SEH Exceptions (/EHa). Почему я не попадаю в блок catch, а вылетаю?
Re: Процесс вылетает несмотря на try - catch(...)
От: dilmah США  
Дата: 28.05.10 09:27
Оценка:
A>Вызов функции, выполняющей этот код, обрамлен блоком try-catch(...), в опциях проекта установлено Enable C++ Exceptions — Yes With SEH Exceptions (/EHa). Почему я не попадаю в блок catch, а вылетаю?

есть код, генерирующий исключения -- скажем метод at() у std::vector.
Твой код не генерирует исключения -- это просто undefined behaviour; обычно он порождает segmentation violation и signal 11.
Re: Процесс вылетает несмотря на try - catch(...)
От: -MyXa- Россия  
Дата: 28.05.10 09:28
Оценка:
Здравствуйте, agendus, Вы писали:

A>// попытка обращения к элементу массива, когда итератор указывает на конец контейнера — ВЫЛЕТ


"Доктор, мне больно когда я так делаю! — Ну не делайте так!" (С) не мой
Если не поможет, будем действовать током... 600 Вольт (C)
Re: Процесс вылетает несмотря на try - catch(...)
От: Kh_Oleg  
Дата: 28.05.10 09:35
Оценка:
Здравствуйте, agendus, Вы писали:

A>Добрый день.

A>Требуется очередной ликбез на тему обработки исключений.
A>Вот код, намеренно приводящий к ошибке (процесс вылетает):

A>
A>iLevel = 0;

A>BidMap::const_iterator c_Bit = (*c_insBit).second.begin();
A>while ( iLevel < _depth || c_Bit != (*c_insBit).second.end() )   // условие ИЛИ приводит к тому, что итерация случится, даже если итератор указывает на конец контейнера
A>        {
A>// попытка обращения к элементу массива, когда итератор указывает на конец контейнера - ВЫЛЕТ
A>            double P = (*c_Bit).first;
            
A>            c_Bit++;
A>            iLevel++;
A>        }
A>


A>Вызов функции, выполняющей этот код, обрамлен блоком try-catch(...), в опциях проекта установлено Enable C++ Exceptions — Yes With SEH Exceptions (/EHa). Почему я не попадаю в блок catch, а вылетаю?

try-catch ловит С++ исключения, типа throw "бабах!";
А у вас Access Violation, что является SEH исключением. А обработкой SEH исключений занимается конструкция __try-__except-__finally-__leave.
Re[2]: Процесс вылетает несмотря на try - catch(...)
От: agendus  
Дата: 28.05.10 09:45
Оценка:
Здравствуйте, Kh_Oleg, Вы писали:

K_O>Здравствуйте, agendus, Вы писали:


A>>Добрый день.

A>>Требуется очередной ликбез на тему обработки исключений.
A>>Вот код, намеренно приводящий к ошибке (процесс вылетает):

A>>
A>>iLevel = 0;

A>>BidMap::const_iterator c_Bit = (*c_insBit).second.begin();
A>>while ( iLevel < _depth || c_Bit != (*c_insBit).second.end() )   // условие ИЛИ приводит к тому, что итерация случится, даже если итератор указывает на конец контейнера
A>>        {
A>>// попытка обращения к элементу массива, когда итератор указывает на конец контейнера - ВЫЛЕТ
A>>            double P = (*c_Bit).first;
            
A>>            c_Bit++;
A>>            iLevel++;
A>>        }
A>>


A>>Вызов функции, выполняющей этот код, обрамлен блоком try-catch(...), в опциях проекта установлено Enable C++ Exceptions — Yes With SEH Exceptions (/EHa). Почему я не попадаю в блок catch, а вылетаю?

K_O>try-catch ловит С++ исключения, типа throw "бабах!";
K_O>А у вас Access Violation, что является SEH исключением. А обработкой SEH исключений занимается конструкция __try-__except-__finally-__leave.

Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться? То есть где-го вне мне нужно создать блок __try __except?
Re[3]: Процесс вылетает несмотря на try - catch(...)
От: Kh_Oleg  
Дата: 28.05.10 10:01
Оценка:
Здравствуйте, agendus, Вы писали:

A>Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться?

Это значит что SEH будут ловиться блоком __try __except.

A>То есть где-го вне мне нужно создать блок __try __except?

Да.
Re[3]: Процесс вылетает несмотря на try - catch(...)
От: _Ursus_  
Дата: 28.05.10 10:04
Оценка: +1
Здравствуйте, agendus, Вы писали:


A>Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться? То есть где-го вне мне нужно создать блок __try __except?


Можно обойтись конструкцией типа


try{

}
catch(std::exception& e){
//здесь ловим С++ исключения
}
catch(...){
//а здесь - ловим SEH
}
Re[3]: Процесс вылетает несмотря на try - catch(...)
От: rus blood Россия  
Дата: 28.05.10 10:21
Оценка:
Здравствуйте, agendus, Вы писали:

A>Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться? То есть где-го вне мне нужно создать блок __try __except?


Посмотри про _set_se_translator
Имею скафандр — готов путешествовать!
Re: Процесс вылетает несмотря на try - catch(...)
От: agendus  
Дата: 28.05.10 10:27
Оценка:
Спасибо всем за ответы))
Столкнулся с проблемой, что компилятор не дает использовать __try __except, когда есть объекты, для которых нужно вызвать деструктор. Буду учиться...
Re[4]: Процесс вылетает несмотря на try - catch(...)
От: gear nuke  
Дата: 30.05.10 23:13
Оценка: 3 (2)
Здравствуйте, Kh_Oleg, Вы писали:

A>>Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться?

K_O>Это значит что SEH будут ловиться блоком __try __except.

MSDN другого мнения

Use /EHa if you want to catch an exception raised with something other than a throw.


A>>То есть где-го вне мне нужно создать блок __try __except?

K_O>Да.

Диспечтер С++ исключений — всего лишь обёртка над SEH, и ловит все.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Процесс вылетает несмотря на try - catch(...)
От: Pavel Dvorkin Россия  
Дата: 31.05.10 07:04
Оценка:
Здравствуйте, gear nuke, Вы писали:

A>>>Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться?

K_O>>Это значит что SEH будут ловиться блоком __try __except.

GN>MSDN другого мнения

GN>

GN>Use /EHa if you want to catch an exception raised with something other than a throw.


Так он и ставит /EHa

Yes With SEH Exceptions (/EHa)
With best regards
Pavel Dvorkin
Re[2]: Процесс вылетает несмотря на try - catch(...)
От: ononim  
Дата: 31.05.10 10:31
Оценка:
A>>// попытка обращения к элементу массива, когда итератор указывает на конец контейнера — ВЫЛЕТ
MX>"Доктор, мне больно когда я так делаю! — Ну не делайте так!" (С) не мой
угу, вот вначале одни пишут такие процессы, а потом другие
Автор: fsmoke
Дата: 31.05.10
имеют экстремальный секс с тем, что написали первые
Как много веселых ребят, и все делают велосипед...
Re: Процесс вылетает несмотря на try - catch(...)
От: ononim  
Дата: 31.05.10 10:39
Оценка: 1 (1)
A>Вызов функции, выполняющей этот код, обрамлен блоком try-catch(...), в опциях проекта установлено Enable C++ Exceptions — Yes With SEH Exceptions (/EHa). Почему я не попадаю в блок catch, а вылетаю?
Одно из двух, или у тебя срабатывает runtime assertion, который не есть исключение вообще, или тебе не повезло. В любом случае лечить подобные проблемы гашением SEH исключений — это расстрел девелопера на месте, после повешения в водоеме с кипящей царской водкой.
Как много веселых ребят, и все делают велосипед...
Re[6]: Процесс вылетает несмотря на try - catch(...)
От: gear nuke  
Дата: 31.05.10 13:47
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Так он и ставит /EHa


Если это так — то проблема в другом месте и __try __except никак её не решат.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: эксперимент
От: Pavel Dvorkin Россия  
Дата: 31.05.10 14:17
Оценка: 1 (1)
Здравствуйте, gear nuke, Вы писали:


PD>>Так он и ставит /EHa


GN>Если это так — то проблема в другом месте и __try __except никак её не решат.


Похоже, все просто.

Установить /EHa

Пример 1


int _tmain(int argc, _TCHAR* argv[])
{
    int * p = NULL;
    try {
        *p = 1;
    }
    catch(...)
    {
        cout << "catch!"<<endl;
        }
    return 0;
}


Печатает "catch!"

Пример 2. На всякий случай


int _tmain(int argc, _TCHAR* argv[])
{
    int x = 0, y = 1;
    try {
        int z =  y / x;
    }
    catch(...)
    {
        cout << "catch!"<<endl;
    }
    return 0;
}


Печатает "catch!"

Пример 3. За неимением у меня класса BidMap решил обойтись std::vector

int _tmain(int argc, _TCHAR* argv[])
{
    vector<int> v(10);
    try {
    for(vector<int>::iterator i = v.begin(); i <=v.end(); i++); // ошибка здесь, должно быть <, а не <=
    }
    catch(...)
    {
        cout << "caught!"<<endl;
    }
    return 0;
}


Debug Assertion Failed! После нажатия Retry попадаем на

_SCL_SECURE_VALIDATE_RANGE(_Myptr < ((_Myvec *)(this->_Getmycont()))->_Mylast);

Вот и все. Скорее всего и с BidMap то же самое. Вылетает, да, но не по исключению.
With best regards
Pavel Dvorkin
Re[8]: эксперимент
От: lost_guadelenn  
Дата: 03.06.10 11:22
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Debug Assertion Failed! После нажатия Retry попадаем на

PD> _SCL_SECURE_VALIDATE_RANGE(_Myptr < ((_Myvec *)(this->_Getmycont()))->_Mylast);
PD>Вот и все. Скорее всего и с BidMap то же самое. Вылетает, да, но не по исключению.

Ну так все правильно — при ассерте вызывается дебаггер командой
_asm { int 3 };

, а это не исключение.
Сейчас проверил — действительно, в обработчик не попадает. Но раз не исключение, то и не должен.

В релизе тоже падает, но там по-моему тоже какая-то внутренняя проверка остается, которая в итоге это прерывание дергает.
Re: Процесс вылетает несмотря на try - catch(...)
От: lost_guadelenn  
Дата: 03.06.10 11:23
Оценка:
Здравствуйте, agendus, Вы писали:

Это не исклюение.
http://rsdn.ru/forum/cpp/3831378.1.aspx
Автор: lost_guadelenn
Дата: 03.06.10
Re: Процесс вылетает несмотря на try - catch(...)
От: Guard_h4s Россия  
Дата: 03.06.10 13:14
Оценка:
Здравствуйте, agendus, Вы писали:

A>Добрый день.

A>Требуется очередной ликбез на тему обработки исключений.


A>Вызов функции, выполняющей этот код, обрамлен блоком try-catch(...), в опциях проекта установлено Enable C++ Exceptions — Yes With SEH Exceptions (/EHa). Почему я не попадаю в блок catch, а вылетаю?


Это исключение. Только вложенное (где нибудь во время свертки стека кидается еще одно). И падает сразу в terminate(). Поэтому и не ловите.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.