Текущий архив: 2003.11.17;
Скачать: CL | DM;
Внизкак работает try...except... Найти похожие ветки
← →
A0th (2003-11-05 17:08) [0]Судя по примеру во встроенной помощи, при возникновении ошибки между try и ecxept, выполняется то, что находится между except и end, но программа всёравно выдаёт ошибку. Может я что-то неправильно понял, не могли бы вы поподробнее объяснить как работает данная конструкция.
← →
TUser (2003-11-05 17:11) [1]Код напиши.
← →
Малиновский Владимир (2003-11-05 17:12) [2]Что ожидаешь?
Что имеешь?
← →
clickmaker (2003-11-05 17:13) [3]Ну если под отладчиком IDE, то ошибка вылезет по-любому. И потом, ты уверен, что в между except и end все ОК ?
Если под отладчиком, мож снять флажок Stop on Delphi Exceptions в настройках отладчика
← →
A0th (2003-11-05 17:35) [4]В моей программе пользователь сам должен вводить формулу.
Я написал пригодный для моей прги интерпретатор. Подставляю значения переменных, высчитываю значения ф-ций, раскрываю скобки и вычисляю результат операций *, /, +, - до тех пор пока не останется просто число. Если же результат отрицательный, происходит зацикливание. Для этого мне необходимо определить является ли результат числом или всё ещё выражением.
Код выглядит так:
try
StrToFloat(TempStr);
except
TempStr:= Calculate(TempStr);
end;
TempStr - выражение
Calculate - ф-ция, которая вычисляет результат операций *,/,+,-
Ошибка возникает в строчке StrToFloat(TempStr).
← →
Anatoly Podgoretsky (2003-11-05 17:37) [5]A0th (05.11.03 17:35) [4]
От куда такая уверенность насчет Calculate, странно как то выглядит этот вызов в данном месте.
← →
mOOx_ (2003-11-05 17:40) [6]См. [3] и запускай по ярлыку на рабочем столе :). А что делает функция Calculate? Что-то плохо вникаю в смысл написанного :)
← →
mOOx_ (2003-11-05 17:41) [7]Удалено модератором
← →
A0th (2003-11-05 17:42) [8]Ошибка EConvertError. Судя по хелпу делать нужно так:
try
StrToFloat(TempStr);
except
on E: EConvertError do Calculate(TempStr);
end;
но ошибка не исчезает
← →
Малиновский Владимир (2003-11-05 17:42) [9]Ну, чтобы зацикливалось, нужно
while True do
try
StrToFloat(TempStr);
break;
except
TempStr:= Calculate(TempStr);
end;
Хотя что-то тут с логикой сомнительно...
← →
mOOx_ (2003-11-05 17:42) [10]Го все равно не въезжаю в смысл :)
← →
TUser (2003-11-05 17:46) [11]Раз такое дело - попробуй вместо StrToFloat поставить val и анализировать код, который она тебе вернет. Или просто просмотреть все символы твоей строки и проверить, все ли они - цифири (+ точка + запятой).
← →
A0th (2003-11-05 17:47) [12]2 Малиновский Владимир
Мне не нужно чтобы происходило зацикливание. Наоборот, в этом проблема. Если у меня получилось отрицательное число (оно выглядит напрмер "-5"), то ф-ция Calculate считает "-" за знак операции и пытается вычислить результат, получая опять "-5"
← →
A0th (2003-11-05 17:51) [13]2 TUser
Я думаю проблема не в ф-ции StrToFloat, а в том, что я неправильно использую конструкцию try...except и проблема от изменении ф-ции не исчезнет. Но всёравно попробую.
← →
Anatoly Podgoretsky (2003-11-05 17:58) [14]Если у тебя отричательное число то исключения не будет, если у тебя неправильное число, то будут два исключения.
Для проверки сделай так
except
TempStr := "ERROR"; // Calculate(TempStr);
или TempStr := "0"; // Calculate(TempStr);
end;
← →
A0th (2003-11-05 18:06) [15]2 Anatoly Podgoretsky
В TempStr у меня может быть либо число(окончательный результат), либо выражение(например "2+3"). Суть в том, что если в TempStr выражение, то необходимо вызвать ф-цию Calculate, чтобы она записала в TempStr "5". Для этого я и делаю проверку в секции try. В случае неудачи нужно вызвать ф-цию Calculate, но выдаётся ошибка EConvertError.
Раньше у меня получалось сделать обработку ошибок деления на ноль таким образом(как в примере), но сейчас эта фишка не прокатывает.
← →
TUser (2003-11-05 18:58) [16]val используй - тебе и try except не понадобится.
← →
Anatoly Podgoretsky (2003-11-05 21:19) [17]A0th (05.11.03 18:06) [15]
Так ты проверил или нет? Без этого дальше невозможно обсуждать тему.
← →
Varfolomey (2003-11-05 23:27) [18]Насколько я понял то тут ошибку выдаёт вункция Calculate.
Попробуй следующий код:
try
StrToFloat(TempStr);
break;
except
try
TempStr:= Calculate(TempStr);
except
// Обработчик ошибки возникшей в функции Calculate
ShowMessage( "Введена неверная функция" );
end;
end;
← →
A0th (2003-11-06 00:20) [19]Отключил в "Tools->Debugger Options->Language Exceptions" опцию "Stop on Delphi Exceptions" и... заработало. exe-файл тоже работает без ошибок.
Теперь, наверное, всё правильно. Тему можно считать закрытой. Спасибо всем за участие. Если у кого возникала/возникнет такая проблема, то вот моё решение(не берусь решать на сколько оно верно, но вроде бы работает). Ещё раз всем спасибо.
← →
default (2003-11-06 00:23) [20]A0th (06.11.03 00:20) [19]
тебе об этом сказали в третьем посте...
← →
A0th (2003-11-06 00:28) [21]2 default
2 clickmaker
Извиняюсь, сразу не понял - среду плохо знаю.
Страницы: 1 вся ветка
Текущий архив: 2003.11.17;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.009 c