Здравствуйте, 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 спокойно приходит.