Форум: "Начинающим";
Текущий архив: 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.006 c