Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

Проблема с Exception   Найти похожие ветки 

 
Franzy   (2006-08-14 23:56) [0]

Даже не знаю, как сформулировать вопрос... попробую описать ситуацию :) Итак, юзер на форме должен ввести некоторые данные и нажать на кнопку, чтобы эти данные были обработаны. В обработчике кнопки в начало помещаю блок TRY ... EXCEPT ... END. Между TRY и EXCEPT считываю данные из полей в переменные. При этом могут возникнуть исключения, если данные не соответствуют типу. В этом случае в блоке EXCEPT вывожу ругательное сообщение и ставлю "exit", чтобы выйти из процедуры и дать юзверю поправить данные на форме.
В общем-то это почти работает, за одним исключением. Если был Exception, то блок EXCEPT выполняется после этого при каждом нажатии кнопки, даже если все данные валидны. То есть еxception как бы остается в памяти.
Вопрос:как его оттуда убрать?
З.Ы. Раньше я в таких случаях скорпулезно проверял все данные на валидность с помощью if... Теперь захотелось так попробовать - полей слишком много, долго возиться.


 
Zeqfreed ©   (2006-08-14 23:58) [1]

> [0] Franzy   (14.08.06 23:56)

Ошибка в коде.


 
Чапаев ©   (2006-08-15 00:07) [2]

код приведи


 
tesseract ©   (2006-08-15 00:11) [3]

> Теперь захотелось так попробовать - полей слишком много,
> долго возиться.

создай процедуры для проверки на нумерабельность, назначать по onchange.


 
Чапаев ©   (2006-08-15 00:13) [4]

> [3] tesseract ©   (15.08.06 00:11)
> > Теперь захотелось так попробовать - полей слишком много,
> > долго возиться.
> создай процедуры для проверки на нумерабельность, назначать
> по onchange.

Ну, о нумерабельности речь ведь не шла.


 
Anatoly Podgoretsky ©   (2006-08-15 00:18) [5]

Код давай


 
Плохиш ©   (2006-08-15 00:30) [6]


> Franzy   (14.08.06 23:56)  
> Даже не знаю, как сформулировать вопрос

Почему тогда задаёшь вопрос не в паравильной конференции?

> Чапаев ©   (15.08.06 00:07) [2]
> Anatoly Podgoretsky ©   (15.08.06 00:18) [5]

Всё б вам чужой код тырить.


 
tesseract ©   (2006-08-15 00:41) [7]

> [4] Чапаев ©   (15.08.06 00:13)


телепатор работает в силу локальных настроек.

Если автор считает, что Exception находиться в памяти............


 
Franzy   (2006-08-15 00:51) [8]

Даю код :) Если интересно - это утилита для оценки качества треугольных и тетраэдрических сеток.
----------------------
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, ExtCtrls, Grids, ValEdit, Gauges,Math, Spin,
 ExtDlgs;

type
 TForm1 = class(TForm)
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   OpenDialog1: TOpenDialog;
   Edit2: TEdit;
   Edit1: TEdit;
   Button1: TButton;
   Button2: TButton;
   Label1: TLabel;
   Label2: TLabel;
   RadioGroup1: TRadioGroup;
   Button3: TButton;
   Label3: TLabel;
   ValueListEditor1: TValueListEditor;
   TabSheet3: TTabSheet;
   Gauge1: TGauge;
   Label4: TLabel;
   RadioGroup2: TRadioGroup;
   Panel1: TPanel;
   Image1: TImage;
   Button4: TButton;
   SpinEdit1: TSpinEdit;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Label8: TLabel;
   Button5: TButton;
   SavePictureDialog1: TSavePictureDialog;
   Label9: TLabel;
   Label10: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button4Click(Sender: TObject);
   procedure Button5Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 Telem = array [1..4] of longint;
 Tnode = array [1..3] of double;
var
 Form1: TForm1;

 nodes : array of TNode;
 elems  : array of Telem;
 vols, ax : array of double;
 n_nodes, n_elems : longint; //number of elems and nodes
 DE, DN, DR : byte; //dimensions number
 BESTAX : double;
 n_ribs: longint;
 maxrib,minrib,avrib,minvol, maxvol,avvol,minax,maxax,avax: double;
 hist : array [1..250] of longint;

implementation

{$R *.dfm}

//Вот эта процедура

procedure TForm1.Button3Click(Sender: TObject);
var i,j,k :longint;
   f: textfile;
   t : textfile;
   v,r,rm,a : double;
   ribs: array[1..4,1..4] of double;

begin
 //params

 form1.Gauge1.Progress:=0;
 Case RadioGroup1.itemindex of
 0: begin
      DE :=3;
      DN :=2;
      DR :=3;
      BESTAX:=sqrt(3);
    end;
 1: begin
      DE :=4;
      DN :=3;
      Dr :=6;
      BESTAX:=sqrt(2)/12;
    end;
 End;

TRY
 AssignFile(t,"log.txt");
 Rewrite(t);

 //load data
 AssignFile(f,edit1.text);
 Reset(f);
 Readln(f,n_nodes);
 SetLength(nodes,n_nodes+1);
 for i:=1 to n_nodes do
  begin
    for j:=1 to DN do read(f,nodes[i,j]);
    readln(f);
  end;
 closefile(f);

 AssignFile(f,edit2.text);
 Reset(f);
 Readln(f,n_elems);
 SetLength(elems,n_elems+1);
 for i:=1 to n_elems do
  begin
    for j:=1 to DE do read(f,elems[i,j]);
    readln(f);
  end;
 closefile(f);

 EXCEPT
   Showmessage("Ошибка ввода-вывода! Убедитесь, что файлы имеют нужный формат и что выбран соответсвующий тип элемента!");
   exit

 END;

 SetLength(ax,n_elems+1);
 SetLength(vols,n_elems+1);
.....


 
Franzy   (2006-08-15 01:26) [9]

------------------------------------------------------------
Вот, здесь можно взять все исходники проги (она уже работает, не считая этой досадной мелочи :)): "http://franzy.hotbox.ru/GridQuality.rar" В архиве прилагаются файлы тестовых 2D- и 3D-сеток.


 
DiamondShark ©   (2006-08-15 01:30) [10]


>  Если был Exception, то блок EXCEPT выполняется после этого
> при каждом нажатии кнопки,

Естественно. Файлы-то не закрываются.


 
DiamondShark ©   (2006-08-15 01:33) [11]

//load data
AssignFile(f,edit1.text);
Reset(f);
try
Readln(f,n_nodes);
SetLength(nodes,n_nodes+1);
for i:=1 to n_nodes do
 begin
   for j:=1 to DN do read(f,nodes[i,j]);
   readln(f);
 end;
finally
  closefile(f);
end;

AssignFile(f,edit2.text);
Reset(f);
try
Readln(f,n_elems);
SetLength(elems,n_elems+1);
for i:=1 to n_elems do
 begin
   for j:=1 to DE do read(f,elems[i,j]);
   readln(f);
 end;
finally
closefile(f);
end;


 
Германн ©   (2006-08-15 01:35) [12]

В детали не вдавался, но ИМХО, режет глаз нумерация динамических массивов начиная с 1. Некошерно это как-то.


 
Германн ©   (2006-08-15 01:38) [13]


> DiamondShark ©   (15.08.06 01:30) [10]
>
>
> >  Если был Exception, то блок EXCEPT выполняется после
> этого
> > при каждом нажатии кнопки,
>
> Естественно. Файлы-то не закрываются.


Цитата из хелпа:
procedure Reset(var F [: File; RecSize: Word ] );

Description

Reset opens the existing external file with the name assigned to F using the mode specified by the global FileMode variable. An error results if no existing external file of the given name exists or if the file can’t be opened with the current file mode. If F is already open, it is first closed and then reopened.


 
Franzy   (2006-08-15 01:40) [14]

2DiamondShark
А куда тогда вставлять сообщение об ошибке? Не в finally же? Оно же ВСЕГДА выполняет? А exit куда?


 
Германн ©   (2006-08-15 01:40) [15]

Пардон. Не заметил, что файловая переменная тут локальная. :(


 
Franzy   (2006-08-15 01:42) [16]

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


 
Германн ©   (2006-08-15 01:42) [17]


> А куда тогда вставлять сообщение об ошибке? Не в finally
> же? Оно же ВСЕГДА выполняет? А exit куда?
>

try
  try
    ...
   except
   ...
   end;
  finally
    ...
  end;


 
Джо ©   (2006-08-15 01:47) [18]

И exit в except — лишний.


 
Franzy   (2006-08-15 01:49) [19]

Хитро :)
То есть, если бы файловая переменная была глобальная, все было бы нормально?!


 
Джо ©   (2006-08-15 01:50) [20]

> [19] Franzy   (15.08.06 01:49)
> Хитро :)
> То есть, если бы файловая переменная была глобальная, все
> было бы нормально?!

Глобальная файловая переменная — это, в большинстве случаев, УЖЕ ненормально :)


 
Franzy   (2006-08-15 01:52) [21]

Как это эксит лишний? Тогда же процедура будет дальше выполняться. Я не хочу ее всю в блок трай загонять. Там три страницы кода с вычислениями.


 
Джо ©   (2006-08-15 01:53) [22]

> [21] Franzy   (15.08.06 01:52)
> Как это эксит лишний? Тогда же процедура будет дальше выполняться

Нет.


 
Джо ©   (2006-08-15 01:54) [23]

Пардон, с недосыпу тут еже чудю :) Почудился raise в блоке except. Sorry :(


 
Германн ©   (2006-08-15 01:57) [24]


> Глобальная файловая переменная — это, в большинстве случаев,
>  УЖЕ ненормально :)
>

Не согласен. Поскольку не уточнено, что понимается под "глобальной переменной", что под "локальной переменной". И какие возможны варианты.

Я бы сказал так - Глобальная файловая переменная как и любая другая "глобальная переменная" может очень часто создавать трудноразрешимые проблемы программисту, не имеющему достаточного опыта работы с паскалем "додельфийского" образца.


 
Джо ©   (2006-08-15 01:59) [25]

> [24] Германн ©   (15.08.06 01:57)
> Я бы сказал так...

Соглашаюсь с такой формулировкой.


 
Плохиш ©   (2006-08-15 10:52) [26]


> TRY
>  AssignFile(t,"log.txt");
>  Rewrite(t);

А это что ещё за загугулина?


 
StriderMan ©   (2006-08-15 11:00) [27]

поставь фладок StopOnDelphiExceptions и узнай почему каждый раз попадаешь в except. или напиши что-то типа

..
except
 on E: Exception do
    ShowMessage("Ошибка: " + E.Message);
 Exit;
end;


 
Плохиш ©   (2006-08-15 11:25) [28]


> DiamondShark ©   (15.08.06 01:33) [11]

Не поможет у него другой файл не закрывается ;-)


 
Franzy   (2006-08-15 16:11) [29]

Все дело было именно в файле лога. Если "ресет" сам закрывает файл, если он был открыт, то "рерайт" - нет. Добавил после except closefile(t), и все заработало, как часы :)


 
Германн ©   (2006-08-15 16:29) [30]


> Если "ресет" сам закрывает файл, если он был открыт, то
> "рерайт" - нет.

Ещё из справки:
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.
Так что не в рерайте собака порылась.


 
Германн ©   (2006-08-15 16:30) [31]

И кстати. Для лога кроме рерайта, очень полезен Аппенд.


 
Franzy   (2006-08-15 16:56) [32]

Хм. Странно. Как бы то ни было, когда добавил указанную строчку, все заработало, как нужно.

Про "Аппенд" - да знаю, конечно. Но здесь в лог записываются конкретные данные по всем элементам оцениваемой сетки. Ессно, что для каждого теста лог обновляется.


 
Германн ©   (2006-08-15 17:05) [33]


> Franzy   (15.08.06 16:56) [32]
>
> Хм. Странно. Как бы то ни было, когда добавил указанную
> строчку, все заработало, как нужно.

Ничего странного. Переменная F в каждом вызове TForm1.Button3Click другая.


 
Плохиш ©   (2006-08-15 18:00) [34]


> Германн ©   (15.08.06 17:05) [33]

Так он тебя не поймёт, у него там переменная T.


 
Anatoly Podgoretsky ©   (2006-08-15 19:25) [35]

В этом случае в блоке EXCEPT вывожу ругательное сообщение

Может не надо, а то в ответ и не такое услышишь.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.085 c
15-1157116694
ArtemESC
2006-09-01 17:18
2006.09.24
Я - чайник...


6-1146908689
Officeman
2006-05-06 13:44
2006.09.24
NMFTP ListItem


4-1148375787
Stanislav
2006-05-23 13:16
2006.09.24
Запуск приложения от имени Администратора


1-1155495277
~viper~
2006-08-13 22:54
2006.09.24
загрузка html страницы


15-1157113777
Stexen
2006-09-01 16:29
2006.09.24
VS2005





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский