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

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

Try...Except не ловит ошибки ввода/вывода


Franzy ©   (2008-06-12 16:41:00) 

В своей программе считываю файл с параметрами (текстовый), в который в определнном порядке записаны различные значения (числа, строки...). Хочу отлавливать момент, если с порядком параметров или из значениями что-то не так.
Для этого заключаю всю процедуру считывания файла в Try...Except. Так, вот исключение не срабатывает, когда параметр задан неверно. Например, пытаюсь считать число, а в файле строка. Если файл не найден - срабатывает. А вот если в файле не то записано - нет :(
Мне это категорически не нравится. Помнится, в Паскале была дериктива компилятора, которая отвечала за обработку ошибок ввода-вывода... В Дельфях тоже такое есть? Если да, то как называется эта деректива?


Правильный_Вася   (2008-06-13 11:59:00) [1]


>  Если не можете ничего предложить

могу
заплати, тебе сделают, как лучше всего

> такой процесс будет сложным (муторным) для конечного пользователя.

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

как обычно
кто хочет - ищет способы
кто не хочет - ищет причины


Franzy   (2008-06-13 11:52:00) [2]

Причем здесь лень? Я спрашиваю, как это сделать лучше всего. Если не можете ничего предложить, молчите, а не сотрясайте воздух пустыми словами. Под сложностью я подразумеваю не то, что МНЕ СЛОЖНО написать - я еще не встречал алгоритмической задачи, которую мне не удалось бы решить - а то, что такой процесс будет сложным (муторным) для конечного пользователя.


> Интересно, кто в здравом уме пишет на Delphi программы для
> расчетов - этоже тормоза неимоверные.


Просто изначально прога была с визуальным интерфейсом, только сейчас переделываю ее в консольную, поэтому она и на Дельфи. Перекодировать ее в Фортран времени уже нет, защита скоро.
Дельфи фортрану, конечно, проигрывает, но я бы не стал называть это неимоверными тормозами.

Так что, конструктивных идей ни у кого нет?


Игорь Шевченко   (2008-06-13 00:09:00) [3]

Читать надо строки и разбирать их в программе.

Интересно, кто в здравом уме пишет на Delphi программы для расчетов - этоже тормоза неимоверные.


Тын-Дын   (2008-06-12 23:48:00) [4]


> Стоит ли слесарю-сантехнику лезть в программистый?


Во-первых, в слесари-сантехники не лезут, а идут.
Во-вторых, не в программистый, а в программисты.


Плохиш   (2008-06-12 23:40:00) [5]


> Franzy   (12.06.08 17:55) [8]
> Да, похоже, этот гад (Дельфи)

Стоит ли слесарю-сантехнику лезть в программистый?


Правильный_Вася   (2008-06-12 20:39:00) [6]


> Нет, так не получится. Да и слишком сложно.

ну, так бы и сказал, что лень

как обычно
чтобы сделать хорошо, времени не хватает
чтобы переделывать, время находится


Franzy   (2008-06-12 19:40:00) [7]


> что мешает юзеру составлять файлы с помощью твоей программы,
>  которая будет проверять корректность перед записью в типизированный
> файл?


Нет, так не получится. Да и слишком сложно. Проще уже проверять данные в основной программе.


ПРавильный_Вася   (2008-06-12 19:26:00) [8]


> файлы составляются именно юзером, поэтому должны быть текстовыми,
>  а не типизированными.

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


Anatoly Podgoretsky   (2008-06-12 18:55:00) [9]

> Franzy  (12.06.2008 18:44:11)  [11]

Как много слов, но толку мало.


Franzy   (2008-06-12 18:44:00) [10]

В том-то и дело, что файлы составляются именно юзером, поэтому должны быть текстовыми, а не типизированными.


Правильный_Вася   (2008-06-12 18:10:00) [11]

используй типизированные файлы


Denis__   (2008-06-12 18:03:00) [12]


> как лучше всего контролировать, что из файла считывается
> именно то, что нужно?

А кто пишет в файл? Если сам, то чего парить? Юзер не должен там лазить и всё.


Franzy   (2008-06-12 17:55:00) [13]

Да, похоже, этот гад (Дельфи) делает именно так. Причем если чисел в файле ему не хватает, он нагло в оставшиеся нули записывает! В результате в проге всякая фигня считается вместо необходимых расчетов.

Внимание вопрос: как лучше всего контролировать, что из файла считывается именно то, что нужно? (Типизированные списки - или как они в дельфях называются? В общем, когда пишутся пары параметр=значение - не подойдут, т.к. значений в файле может быть до нескольких сотен.)
Есть ли директива, которая заставляет Дельфи четко следить за совпадением типов считываемых данных? Или проще самому строки обрабатывать?


Плохиш   (2008-06-12 17:36:00) [14]


> Franzy   (12.06.08 17:29) [6]
> Речь не о том. Предположим, нужно считать целое число (по
> типу), а в файле окажется дробное. Разве не должна в таком
> случае ошибка выскакивать?

И хде обшипка? Число считается до первого символа, не подходящего по правилам к затребованному типу. Или может у тебя цифры до точки не являются целым числом?


Franzy   (2008-06-12 17:29:00) [15]

Речь не о том. Предположим, нужно считать целое число (по типу), а в файле окажется дробное. Разве не должна в таком случае ошибка выскакивать?


Правильный_Вася   (2008-06-12 17:14:00) [16]


>  исключение не срабатывает, когда параметр задан неверно
> Например, пытаюсь считать число, а в файле строка.

не вижу ни одного неверного параметра
типы привел бы для своих глобальных переменных


Franzy   (2008-06-12 17:03:00) [17]

Ну почему же секретный...

procedure ReadInputData;
var f:textfile;
   i, j: longint;
begin

 contour:=nil;
 contourlen:=nil;
 BasePoints:=nil;
 NCIV:=nil;

 AssignFile(f,inputs);

 Try
   Reset(f);
   //read base nodes
   Readln(f,nBasePoints);
   SetLength(BasePoints,nBasePoints+1);
   for i:=1 to nBasePoints do
     readln(f,basepoints[i].x,basepoints[i].y);

   //read contours
   WriteLn('Reading volume data...');
   WriteLn('  Base nodes read: ',nBasePoints);
   Readln(f,nSubvolumes);
   SetLength(NCIV,nSubVolumes+1);
   nContours:=0;
   //SetLength(contour,nVolumes+1);
   //SetLength(contourlen,nVolumes+1);
   for i:=1 to nSubVolumes do
     begin
       read(f,NCIV[i]);
       nContours:= nContours +  NCIV[i];
       SetLength(contour,nContours+1);
       SetLength(contourlen,nContours+1);
       read(f,contourlen[i]);
       SetLength(contour[i],contourlen[i]+2);
       for j:=1 to contourlen[i] do
        read(f,contour[i][j]);
       contour[i][contourlen[i]+1]:=contour[i][1];
     end;

   WriteLn('  Subvolumes read: ', nSubVolumes);
   WriteLn('  Contours read: ', nContours);

   maxx:=BasePoints[1].x;
   minx:=BasePoints[1].x;
   maxy:=BasePoints[1].y;
   miny:=BasePoints[1].y;

   for i:=2 to nBasePoints do
     begin
      if BasePoints[i].x<minx then minx:=BasePoints[i].x;
      if BasePoints[i].x>maxx then maxx:=BasePoints[i].x;
      if BasePoints[i].y<miny then miny:=BasePoints[i].y;
      if BasePoints[i].y>maxy then maxy:=BasePoints[i].y;
     end;

   if not(eof(f)) then
     begin
       readln(f,nst);
       segment_type:=nil;
       SetLength(segment_type,nst+1);
       for i:=1 to nst do
         ReadLn(f,segment_type[i].n1,segment_type[i].n2,segment_type[i].typ);
       WriteLn('  Custom segments read: ',nst);
     end;

   closefile(f);
 Except
   WriteLn('INPUT ERROR 04: Error reading volume data.');
   Halt(8);
 End;

end;


Правильный_Вася   (2008-06-12 16:56:00) [18]


> В Дельфях тоже такое есть? Если да, то как называется эта
> деректива?

так же как и раньше
{I+}
{I-}


Тын-Дын   (2008-06-12 16:56:00) [19]


> Franzy   (12.06.08 16:41) 


Код для чтения секретный?


Anatoly Podgoretsky   (2008-06-12 16:50:00) [20]

Если все правильно написал, то должна ловить.


Наверх

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