Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-56754
Zanik
2003-11-06 16:03
2003.11.17
Как в Chart задать для Х свои имена?


3-56476
Vemer
2003-10-28 10:28
2003.11.17
Превращение столбца в строку


1-56762
GIL
2003-11-06 14:29
2003.11.17
минимизация окна


1-56760
slivka
2003-11-06 14:09
2003.11.17
Проблема с циклoм For To do.


3-56496
Raduga
2003-10-28 11:30
2003.11.17
Формат вывода даты (ADO+Access)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский