Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с Exception [D7, WinXP]


Страницы:   1 2

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]

Но в общем, я так понял, смысл этой "зацикленной" ошибки в том, что пытаюсь открыть уже открытые файлы?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо