Добрый день.
Требуется очередной ликбез на тему обработки исключений.
Вот код, намеренно приводящий к ошибке (процесс вылетает):
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, а вылетаю?
A>Вызов функции, выполняющей этот код, обрамлен блоком try-catch(...), в опциях проекта установлено Enable C++ Exceptions — Yes With SEH Exceptions (/EHa). Почему я не попадаю в блок catch, а вылетаю?
есть код, генерирующий исключения -- скажем метод at() у std::vector.
Твой код не генерирует исключения -- это просто undefined behaviour; обычно он порождает segmentation violation и signal 11.
Здравствуйте, 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(...)
Здравствуйте, 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(...)
Здравствуйте, agendus, Вы писали:
A>Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться?
Это значит что SEH будут ловиться блоком __try __except.
A>То есть где-го вне мне нужно создать блок __try __except?
Да.
Re[3]: Процесс вылетает несмотря на try - catch(...)
A>Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться? То есть где-го вне мне нужно создать блок __try __except?
Здравствуйте, agendus, Вы писали:
A>Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться? То есть где-го вне мне нужно создать блок __try __except?
Спасибо всем за ответы))
Столкнулся с проблемой, что компилятор не дает использовать __try __except, когда есть объекты, для которых нужно вызвать деструктор. Буду учиться...
Re[4]: Процесс вылетает несмотря на try - catch(...)
Здравствуйте, Kh_Oleg, Вы писали:
A>>Но я же поставил опцию With SEH Exceptions. Это не значит, что структурные исключения будут ловиться? K_O>Это значит что SEH будут ловиться блоком __try __except.
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(...)
Здравствуйте, 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(...)
A>>// попытка обращения к элементу массива, когда итератор указывает на конец контейнера — ВЫЛЕТ MX>"Доктор, мне больно когда я так делаю! — Ну не делайте так!" (С) не мой
угу, вот вначале одни пишут такие процессы, а потом другие
A>Вызов функции, выполняющей этот код, обрамлен блоком try-catch(...), в опциях проекта установлено Enable C++ Exceptions — Yes With SEH Exceptions (/EHa). Почему я не попадаю в блок catch, а вылетаю?
Одно из двух, или у тебя срабатывает runtime assertion, который не есть исключение вообще, или тебе не повезло. В любом случае лечить подобные проблемы гашением SEH исключений — это расстрел девелопера на месте, после повешения в водоеме с кипящей царской водкой.
Как много веселых ребят, и все делают велосипед...
Re[6]: Процесс вылетает несмотря на try - catch(...)
Здравствуйте, 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
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Debug Assertion Failed! После нажатия Retry попадаем на PD> _SCL_SECURE_VALIDATE_RANGE(_Myptr < ((_Myvec *)(this->_Getmycont()))->_Mylast); PD>Вот и все. Скорее всего и с BidMap то же самое. Вылетает, да, но не по исключению.
Ну так все правильно — при ассерте вызывается дебаггер командой
_asm { int 3 };
, а это не исключение.
Сейчас проверил — действительно, в обработчик не попадает. Но раз не исключение, то и не должен.
В релизе тоже падает, но там по-моему тоже какая-то внутренняя проверка остается, которая в итоге это прерывание дергает.
Здравствуйте, agendus, Вы писали:
A>Добрый день. A>Требуется очередной ликбез на тему обработки исключений.
A>Вызов функции, выполняющей этот код, обрамлен блоком try-catch(...), в опциях проекта установлено Enable C++ Exceptions — Yes With SEH Exceptions (/EHa). Почему я не попадаю в блок catch, а вылетаю?
Это исключение. Только вложенное (где нибудь во время свертки стека кидается еще одно). И падает сразу в terminate(). Поэтому и не ловите.