Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.13;
Скачать: CL | DM;

Вниз

Try...Except не ловит ошибки ввода/вывода   Найти похожие ветки 

 
Franzy   (2008-06-12 16:41) [0]

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


 
Anatoly Podgoretsky ©   (2008-06-12 16:50) [1]

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


 
Тын-Дын ©   (2008-06-12 16:56) [2]


> Franzy   (12.06.08 16:41) 


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


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


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

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


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

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

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 17:14) [5]


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

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


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

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


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


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

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


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

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

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


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


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

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


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

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


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

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


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

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

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


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


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

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


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


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


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


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


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

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

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


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


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

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


 
Тын-Дын ©   (2008-06-12 23:48) [17]


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


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


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

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

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


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

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


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


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

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


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


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

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

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

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

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



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

Текущий архив: 2008.07.13;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
2-1213304675
MaryM
2008-06-13 01:04
2008.07.13
Drag &amp; Drop TreeView


15-1211959111
guav
2008-05-28 11:18
2008.07.13
Интересная пропозиция для С++, в Delphi тоже такое надо


15-1211975218
SergP
2008-05-28 15:46
2008.07.13
test


2-1213494964
DJ_UZer
2008-06-15 05:56
2008.07.13
SynEdit добавление текста


15-1211734954
Дмитрий С
2008-05-25 21:02
2008.07.13
Облегчить реализацию IDispach