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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
2-1213439467
WebSQLNeederr
2008-06-14 14:31
2008.07.13
Как отключить яваскрипт в TWebbrowser ?


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


3-1201989045
md10
2008-02-03 00:50
2008.07.13
существование поля


3-1202068859
Slim
2008-02-03 23:00
2008.07.13
Как установить фокус в DbGridEh на нужный столбец?


2-1213603321
Dmitry
2008-06-16 12:02
2008.07.13
#13#10





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