![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Если все правильно написал, то должна ловить.