Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

после отработки catch(...) исключение остается необработанным и передается выше...

78K
17 января 2012 года
al777
5 / / 17.01.2012
Здравствуйте все!
Такая ситуация интересная:
Visual Stidio 2008.
Есть код типа этого:
 
Код:
int V = 0;
double d,Old = 0.0;
try {
  d = (double)V/Old;
} catch (...) {
 PRINT_LOG();
}
a = d;

catch(...) отрабатывает, НО:
после него не выполняется a = d, а исключение вылетает выше - в вызвавшую ф-ию, где тоже есть try-catch. Отрабатывает следующий catch(...) и после него - тоже вылетает на уровень выше и программа выполняет недопустимую операцию.
SEH включена (/EHa).
Исключения для Floating point включены (/fp:except).

В вывод пишет такое:
Цитата:
Первый этап обработки исключения в "0x00c67b5c" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x00c5d5a8" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x727b23cc" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x75ea7c1a" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x727b23cc" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x75ea7c1a" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x75ea7c1a" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x727b23cc" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x727b23cc" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x00c66f54" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x6d6466f6" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x75ea7c1a" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x75ea7c1a" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x75ea7c1a" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Первый этап обработки исключения в "0x75ea7c1a" в "Project1.exe": 0xC0000090: Floating-point invalid operation.
Необработанное исключение в "0x75ea7c1a" в "Project1.exe": 0xC0000090: Floating-point invalid operation.



Как это вообще получается? Что я не так делаю?
Почему catch'и получают управление, но исключение продолжает передаваться выше?
Как бороться?
(__except пока не пробовал - не дает использовать из-за объектов, да и с catch бы разобраться...)

Заранее всем спасибо.

341
17 января 2012 года
Der Meister
874 / / 21.12.2007
При делении 0.0 на 0.0 получим значение NaN, а не исключение.
78K
17 января 2012 года
al777
5 / / 17.01.2012
Цитата: Der Meister
При делении 0.0 на 0.0 получим значение NaN, а не исключение.


Ну, я привел упрощенный код. У меня чуть больше вычислений, Отладчик показывает 0.00000, но, возможно, там не ровно 0. В общем, в моем случае почему-то вылетает (иначе я б не создавал этой темы :)). И проблема не в этом (я могу и на очень маленькое число проверить - не внапряг) - вопрос в другом: почему после отработки catch исключение остается?
И как с этим бороться в дальнейшем?

78K
17 января 2012 года
al777
5 / / 17.01.2012



За литературу спасибо, разбираюсь... Но пока непонятно - как это: catch срабатывает, а исключение остается...

277
17 января 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: al777
За литературу спасибо, разбираюсь... Но пока непонятно - как это: catch срабатывает, а исключение остается...



Чего тут не понятного:

 
Код:
catch(Exception e)
{
e->Delete();
}

catch(...) делает re-throw исключения
78K
18 января 2012 года
al777
5 / / 17.01.2012
Цитата: arrjj
Чего тут не понятного:
 
Код:
catch(Exception e)
{
e->Delete();
}

catch(...) делает re-throw исключения



Не знаю - не замечал в catch(...) такого. Он все сам гасит. Обычно :)

78K
18 января 2012 года
al777
5 / / 17.01.2012
В общем, поигрался я, поигрался...
Пробовал _set_se_translator - та же фигня.
Полечилось только с помощью _clearfp() (подсказали на msdn.ru) - похоже, не сбрасывался флаг исключения какой-нибудь..., и после catch(...) любое обращение к сопроцессору приводило к еще одному исключению :)
Всем спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог