Почему С++ Builder не перехватывает математические ошибки...
В классическом C++ есть математическая библиотека, прототипы функций которой описаны в заголовочном файле math.h
:
#include <math.h> //... z=pow(x,y);
Увы, в C++ Builder этот код сгенерирует ошибку, например, при x=y=0
, и обработка исключений стандартным блоком
try/catch
не поможет.
Дело в том, что блок try/catch
работает только тогда, когда функции,
которые надо обработать, генерируют исключения на уровне Windows.
Стандартные функции из math.h
исключений не создают. Они изменяют значение переменной
errno
и возвращают какой-то результат. Возможное решение проблемы - писать отдельный
обработчик исключений средствами библиотеки math.h
, это, в общем-то, возможно
(п. 8.4), только куда он будет выводить результаты - в консоль, которой в приложении нету?
А вот, скажем, заменив вызов функции
pow(x,y)
на Power(x,y)
или
log(x)
на LogN(число_E,x)
,
получим то, что нужно:
try { z=Power(x,y); } catch (...) { ShowMessage ("Не удалось возвести в степень!"); return; }
Для работы "альтернативных" математических функций к модулю нужно подключить заголовочный файл
#include <Math.hpp>
К сожалению, в Math.hpp
есть не всё - скажем, получить константу e
для вычисления
натурального логарфима мне удалось только через math.h
:
#include <Math.hpp> #include <math.h> //... z=LogN(M_E,x);
Ещё учтите, что при включённой в Builder отладке и запуске приложения из-под Билдера, среда всё равно перехватит ошибку раньше приложения. Чтобы увидеть в действии контроль ошибок, запустите исполняемый файл приложения не из среды, а из папки с EXE-файлом. Как сделать "полноценный" EXE-файл, который будет запускаться на машинах без установленного C++ Builder - тут.
29.04.2013, 13:52 [13400 просмотров]