![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Exception [D7, WinXP]
Franzy © (2006-08-14 23:56:00)Даже не знаю, как сформулировать вопрос... попробую описать ситуацию :) Итак, юзер на форме должен ввести некоторые данные и нажать на кнопку, чтобы эти данные были обработаны. В обработчике кнопки в начало помещаю блок TRY ... EXCEPT ... END. Между TRY и EXCEPT считываю данные из полей в переменные. При этом могут возникнуть исключения, если данные не соответствуют типу. В этом случае в блоке EXCEPT вывожу ругательное сообщение и ставлю "exit", чтобы выйти из процедуры и дать юзверю поправить данные на форме.
В общем-то это почти работает, за одним исключением. Если был Exception, то блок EXCEPT выполняется после этого при каждом нажатии кнопки, даже если все данные валидны. То есть еxception как бы остается в памяти.
Вопрос:как его оттуда убрать?
З.Ы. Раньше я в таких случаях скорпулезно проверял все данные на валидность с помощью if... Теперь захотелось так попробовать - полей слишком много, долго возиться.
Anatoly Podgoretsky (2006-08-15 19:25:00) [1]В этом случае в блоке EXCEPT вывожу ругательное сообщение
Может не надо, а то в ответ и не такое услышишь.
Плохиш (2006-08-15 18:00:00) [2]
> Германн © (15.08.06 17:05) [33]
Так он тебя не поймёт, у него там переменная T.
Германн (2006-08-15 17:05:00) [3]
> Franzy (15.08.06 16:56) [32]
>
> Хм. Странно. Как бы то ни было, когда добавил указанную
> строчку, все заработало, как нужно.
Ничего странного. Переменная F в каждом вызове TForm1.Button3Click другая.
Franzy (2006-08-15 16:56:00) [4]Хм. Странно. Как бы то ни было, когда добавил указанную строчку, все заработало, как нужно.
Про "Аппенд" - да знаю, конечно. Но здесь в лог записываются конкретные данные по всем элементам оцениваемой сетки. Ессно, что для каждого теста лог обновляется.
Германн (2006-08-15 16:30:00) [5]И кстати. Для лога кроме рерайта, очень полезен Аппенд.
Германн (2006-08-15 16:29:00) [6]
> Если "ресет" сам закрывает файл, если он был открыт, то
> "рерайт" - нет.
Ещё из справки:
procedure Rewrite(var F: File [; Recsize: Word ] );
Description
Rewrite creates a new external file with the name assigned to F.
F is a variable of any file type associated with an external file using AssignFile. RecSize is an optional expression, which can be specified only if F is an untyped file. If F is an untyped file, RecSize specifies the record size to be used in data transfers. If RecSize is omitted, a default record size of 128 bytes is assumed.
If an external file with the same name already exists, it is deleted and a new empty file is created in its place.
If F is already open, it is first closed and then re-created.
Так что не в рерайте собака порылась.
Franzy (2006-08-15 16:11:00) [7]Все дело было именно в файле лога. Если "ресет" сам закрывает файл, если он был открыт, то "рерайт" - нет. Добавил после except closefile(t), и все заработало, как часы :)
Плохиш (2006-08-15 11:25:00) [8]
> DiamondShark © (15.08.06 01:33) [11]
Не поможет у него другой файл не закрывается ;-)
StriderMan (2006-08-15 11:00:00) [9]поставь фладок StopOnDelphiExceptions и узнай почему каждый раз попадаешь в except. или напиши что-то типа
..
except
on E: Exception do
ShowMessage('Ошибка: ' + E.Message);
Exit;
end;
Плохиш (2006-08-15 10:52:00) [10]
> TRY
> AssignFile(t,'log.txt');
> Rewrite(t);
А это что ещё за загугулина?
Джо (2006-08-15 01:59:00) [11]> [24] Германн © (15.08.06 01:57)
> Я бы сказал так...
Соглашаюсь с такой формулировкой.
Германн (2006-08-15 01:57:00) [12]
> Глобальная файловая переменная — это, в большинстве случаев,
> УЖЕ ненормально :)
>
Не согласен. Поскольку не уточнено, что понимается под "глобальной переменной", что под "локальной переменной". И какие возможны варианты.
Я бы сказал так - Глобальная файловая переменная как и любая другая "глобальная переменная" может очень часто создавать трудноразрешимые проблемы программисту, не имеющему достаточного опыта работы с паскалем "додельфийского" образца.
Джо (2006-08-15 01:54:00) [13]Пардон, с недосыпу тут еже чудю :) Почудился raise в блоке except. Sorry :(
Джо (2006-08-15 01:53:00) [14]> [21] Franzy (15.08.06 01:52)
> Как это эксит лишний? Тогда же процедура будет дальше выполняться
Нет.
Franzy (2006-08-15 01:52:00) [15]Как это эксит лишний? Тогда же процедура будет дальше выполняться. Я не хочу ее всю в блок трай загонять. Там три страницы кода с вычислениями.
Джо (2006-08-15 01:50:00) [16]> [19] Franzy (15.08.06 01:49)
> Хитро :)
> То есть, если бы файловая переменная была глобальная, все
> было бы нормально?!
Глобальная файловая переменная — это, в большинстве случаев, УЖЕ ненормально :)
Franzy (2006-08-15 01:49:00) [17]Хитро :)
То есть, если бы файловая переменная была глобальная, все было бы нормально?!
Джо (2006-08-15 01:47:00) [18]И exit в except — лишний.
Германн (2006-08-15 01:42:00) [19]
> А куда тогда вставлять сообщение об ошибке? Не в finally
> же? Оно же ВСЕГДА выполняет? А exit куда?
>
try
try
...
except
...
end;
finally
...
end;
Franzy (2006-08-15 01:42:00) [20]Но в общем, я так понял, смысл этой "зацикленной" ошибки в том, что пытаюсь открыть уже открытые файлы?