Как сделать обработку исключении на простом примере?
Добавлено: 26.05.2015 21:42:23
Привет всем! Решил (ну как решил, в универе д\з такое было, основную часть сделал, но меня затянуло) написать простенькую программу для вырисовки графиков используя модуль Graph. Всё бы хорошо, но ударила моча в голову сделать прогу, как говорится "универсальной", ну или хотя бы очень удобной для вывода на экран различных графиков. Вся соль в том что, у функции, как мы все знаем, есть область допустимых значении за границы которых нельзя выходить иначе поиск функции по Х, лежащей где-то вне ОДЗ, чревато стонами дебагера о Великой Ошибке и последующим неприятным обрушением программы . И тут встал вопрос, как пробежаться по всем значениям X, не вызвав это исключение во время вычислении. К примеру я беру функцию y=ln(x). Как мы знаем ОДЗ в данном случае при Х>0, но что если я не хочу писать так:
Ведь в любой момент времени и места, я могу взять исходник и поменять функцию на другую (простите но в самой программе ввод необходимой функции я ещё не научился делать, не злитесь ):
В таком случае, мне нужно искать ОДЗ и писать его в условие, когда я всего навсего могу сделать так:
И тут я попадаю впросак: при выполнении программы по-прежнему выводиться сообщение дебагера о ошибке мол проект вызвал класс исключении: "External: SIGFPE" в строчке F:=(sqrt(x*x*x*x*x)/(3*(x*x))+(12*x)-3)*step_y;
Помогите пожалуйста добрые люди, что я делаю не так? Почему сигнал не перехватывается обработчиком исключении? Есть ли путь обойти эту проблему с ОДЗ без использования танцев с бубном и муторных его поисков вручную? Заранее благодарю! P.S. Я программирую сейчас только на Pascal и то на уровне плинтуса, так что если я буду что-то не понимать, отнеситесь к этому с понимаем. Спасибо
- Код: Выделить всё
function F(x:real):real; //y=ln(x);
begin
if x>0 then F:=ln(x)*step_y; //step_y - коэффициент для масштабирования графика по Y
end;
Ведь в любой момент времени и места, я могу взять исходник и поменять функцию на другую (простите но в самой программе ввод необходимой функции я ещё не научился делать, не злитесь ):
- Код: Выделить всё
function F(x:real):real; //y=sqrt(x^5)/(3x^2+12x-3)
begin
if x ??? then // Ну и что за ОДЗ ?
F:=(sqrt(x*x*x*x*x)/(3*(x*x))+(12*x)-3)*step_y;
end;
В таком случае, мне нужно искать ОДЗ и писать его в условие, когда я всего навсего могу сделать так:
- Код: Выделить всё
function F(x:real):real; //y=sqrt(x^5)/(3x^2+12x-3)
begin
try
F:=(sqrt(x*x*x*x*x)/(3*(x*x))+(12*x)-3)*step_y;
except
F:=0;
end;
end;
И тут я попадаю впросак: при выполнении программы по-прежнему выводиться сообщение дебагера о ошибке мол проект вызвал класс исключении: "External: SIGFPE" в строчке F:=(sqrt(x*x*x*x*x)/(3*(x*x))+(12*x)-3)*step_y;
Помогите пожалуйста добрые люди, что я делаю не так? Почему сигнал не перехватывается обработчиком исключении? Есть ли путь обойти эту проблему с ОДЗ без использования танцев с бубном и муторных его поисков вручную? Заранее благодарю! P.S. Я программирую сейчас только на Pascal и то на уровне плинтуса, так что если я буду что-то не понимать, отнеситесь к этому с понимаем. Спасибо