Как вызвать exception'ы в математических функциях в C++?

Мне нужно вызвать исключения во время работы программы в математических функциях, и отловить их.

Например, я вызывал ошибку деления на ноль

float division(int a,int b)
{
    if (b == 0)
    {
        throw "Деление на ноль!";
    }
    return a / b;
}

void runtime__error()
{
    try {
        float z = division(3,0);
        cout << z << endl;
    } catch (const char* msg) {
        cerr << msg << endl;
    }

}

Покажите пожалуйста примеры кода, вызывающие например overflow error в функции pow(). За любые другие примеры runtime ошибок из math.h буду благодарен


Ответы (1 шт):

Автор решения: Harry

Ну, примерно так можно (читайте тут и тут) -

void throw_fe()
{
    if (errno) throw runtime_error(strerror(errno));
    if(fetestexcept(FE_DIVBYZERO))     throw runtime_error("FE_DIVBYZERO");
    if(fetestexcept(FE_INEXACT))       throw runtime_error("FE_INEXACT");
    if(fetestexcept(FE_INVALID))       throw runtime_error("FE_INVALID");
    if(fetestexcept(FE_OVERFLOW))      throw runtime_error("FE_OVERFLOW");
    if(fetestexcept(FE_UNDERFLOW))     throw runtime_error("FE_UNDERFLOW");
}

double Pow(double x, double y)
{
    errno = 0;
    feclearexcept(FE_ALL_EXCEPT);
    double z = pow(x,y);
    throw_fe();
    return z;
}

double Sqrt(double x)
{
    errno = 0;
    feclearexcept(FE_ALL_EXCEPT);
    double z = sqrt(x);
    throw_fe();
    return z;
}

double Log(double x)
{
    errno = 0;
    feclearexcept(FE_ALL_EXCEPT);
    double z = log(x);
    throw_fe();
    return z;
}

int main()
{
    try {
        double q = Sqrt(-2) + Pow(1e20,1e20);
        printf("log(0) = %lf, Q = %lf\n", Log(0), q);
    } catch(exception&e)
    {
        cout << "Catch: " << e.what()  << endl;
    }
}

Только вот, увы, не гарантирую, что это верное, переносимое, везде работающее решение... Но на VC++ и GCC вроде как отрабатывает.

"По-моему, так" (с) Пух

→ Ссылка