Как вызвать 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 вроде как отрабатывает.
"По-моему, так" (с) Пух