Re[2]: Обработка исключений FPU на C++
От: Vaynamond Россия  
Дата: 17.11.24 18:21
Оценка:
Здравствуйте, kov_serg, Вы писали:

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


V>>Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ?

V>>Пытаюсь с помощью SEH — целочисленное деление на 0 отлавливает, а double не хочет. Т.е. EXCEPTION_FLT_DIVIDE_BY_ZERO вообще мимо кассы.
V>>Можно, конечно, проверять _statusfp(), и это срабатывает, но зачем тогда EXCEPTION_FLT_* ?

_>https://en.cppreference.com/w/cpp/numeric/math/isfinite

_>https://en.cppreference.com/w/cpp/numeric/math/isinf
_>https://en.cppreference.com/w/cpp/numeric/math/isnan

_>
_>#include <cmath>
_>#include <iostream>

_>double divide(double a,double b) {
_>    double r=a/b;
_>    if (!std::isfinite(r)) throw std::overflow_error("Divide by zero exception");
_>    return r;
_>}

_>int main(int argc, char const *argv[]) {
_>    try {
_>        double z=divide(1,0);
_>    } catch(std::overflow_error e) {
_>        std::cerr<<"ERROR: "<<e.what()<<std::endl;
_>    }
_>    return 0;
_>}
_>

На MS VS 2010 такое не прокатывает, ругается на std::isfinite
Но это, по сути, аналог _statusfp() с последующим выбросом исключения С++. Такой вариант у меня есть, но ИМХО похоже на костыль.
Вопрос, почему EXCEPTION_FLT_* не срабатывают...

_>ps: А вы попробуйте целочисленное деление в linux отловить с помощью исключений

Про Linux не скажу, а на Windows EXCEPTION_INT_DIVIDE_BY_ZERO спокойно приходит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.