Консультация № 88150
22.05.2007, 22:27
0.00 руб.
0 1 1
Как в C++ Builder 6 отловить исключение переполнения? У еня почему-то не работает этот кусок (напримре если ввести 9999 в степени 999 оно не влезет в long double).

Приложение:
try{ accum = pow(accum,op2);}catch(EOverflow&){ ShowMessage("Ошибка");}

Обсуждение

Неизвестный
23.05.2007, 10:54
общий
это ответ
Здравствуйте, WraiZ!
строка accum = pow(9999, 999); выкидывает окно со словами pow: OVERFLOW error. но это не идёт как исключение.
в помощи по pow сказано, когда возникает переполнение, то функция возвращает число "HUGE_VAL (pow) or _LHUGE_VAL (powl)". В частности если продебуггить, то получается +INF. обработку таких ошибок (описано ниже) можно осуществить через " _matherr and _matherrl". в принципе для твоих нужд согласно примера я переделал эту функцию так:

int _matherr (struct _exception *a)
{
if (a->type == OVERFLOW)
throw EOverflow(AnsiString(a->name) + "(" + FloatToStr(a->arg1) + "," + FloatToStr(a->arg2) + ") - overflow");
return 0;
}

благодаря чему выскакивает именно твоё исключение, а если переполнение возникает не по вызову функции, например так: accum = pow(999, 99) * 9999999 * 9999999;
то компилятор сразу выкидывает это исключение, миную функцию, так как она годиться только для математических функций.
Форма ответа