после отработки catch(...) исключение остается необработанным и передается выше...
Такая ситуация интересная:
Visual Stidio 2008.
Есть код типа этого:
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).
В вывод пишет такое:
Первый этап обработки исключения в "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 бы разобраться...)
Заранее всем спасибо.
Ну, я привел упрощенный код. У меня чуть больше вычислений, Отладчик показывает 0.00000, но, возможно, там не ровно 0. В общем, в моем случае почему-то вылетает (иначе я б не создавал этой темы :)). И проблема не в этом (я могу и на очень маленькое число проверить - не внапряг) - вопрос в другом: почему после отработки catch исключение остается?
И как с этим бороться в дальнейшем?
чтиво:
http://msdn.microsoft.com/en-us/library/4t3saedz.aspx
http://msdn.microsoft.com/en-us/library/5skw957f.aspx
http://msdn.microsoft.com/en-us/library/de5awhsw.aspx
За литературу спасибо, разбираюсь... Но пока непонятно - как это: catch срабатывает, а исключение остается...
Чего тут не понятного:
{
e->Delete();
}
catch(...) делает re-throw исключения
{
e->Delete();
}
catch(...) делает re-throw исключения
Не знаю - не замечал в catch(...) такого. Он все сам гасит. Обычно :)
Пробовал _set_se_translator - та же фигня.
Полечилось только с помощью _clearfp() (подсказали на msdn.ru) - похоже, не сбрасывался флаг исключения какой-нибудь..., и после catch(...) любое обращение к сопроцессору приводило к еще одному исключению :)
Всем спасибо!