Текущий архив: 2004.01.13;
Скачать: CL | DM;
ВнизПочему вываливается External Exception? Найти похожие ветки
← →
BOA_KAA (2003-12-25 20:09) [0]Здравствуйте!
Дело такое: на клик по одной из MenuItem открывается файл. В обработчике клика присутствует такой код:
OpenGrid(FileName, Vers);
Метод OpenGrid описан в разделе public формы следующим образом:
procedure OpenGrid(FileName, Vers: String);
В методе OpenGrid создается экземпляр TFileStream:
fsFile:=TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
Создается он внутри try...except. Так вот при попытке открытия файла вываливается сабж. Причем трассировка метода дала интересный результат. Все тело проходится без сучка без задоринки, но где-то на выходе (при возвращении управления в клик) вылетает ошибка, пугает, но дело свое метод делает, грид открывается. Параметры FileName и Vers описаны с теми же именами в разделе public.
Что еще добавить не знаю. Не поможите? Спасибо!
← →
Ломброзо (2003-12-25 21:05) [1]шут его знает. Надо смотреть, в каком модуле возникает исключение. Настораживает 1) одинаковые имена параметров в public-формы и параметрах метода 2) отсутствие const (OpenGrid(const FileName: string; const Vers: String);
← →
Sandman25 (2003-12-26 11:18) [2]Ломброзо прав.
Используются именно Self.FileName и Self.Vers, а не параметры.
Помните о неявном with Self do в начале каждого метода!
Называйте параметры AFileName и AVers.
← →
BOA_KAA (2003-12-26 17:53) [3]Еще раз всем привет и спасибо откликнувшимся, но это не помогает.
Кстати, еще интересно: дома ошибка вылетает на другой метод. То есть есть два обработчика кликов для двух разных методов (mmOpenClick и mmNewClick). Так вот вызов OpenGrid идет из первого метода, а вылетает во второй, хотя они и не связаны ничем (по крайней мере визуально) кроме того, что в обоих присутствует одинаковый метод (запрос на сохранение).
Чего-то нагородил... Лучше один раз увидеть:
procedure TfrmMain.mmOpenClick(Sender: TObject);
begin
if not SaveNotify then Exit; // это одинаковость :)
if not dgOpen.Execute then Exit;
FileName:=dgOpen.FileName;
OpenGrid(FileName, Vers);
end;
procedure TfrmMain.mmNewClick(Sender: TObject);
var
i: Integer;
begin
if not SaveNotify then Exit; // вылетает сюда :(
for i:=1 to sgData.ColCount-1 do
sgData.Cols[i].Clear;
seColCount.Value:=1;
BaseInit;
sgData.Row:=1;
sgData.Col:=1;
end;
← →
Sandman25 (2003-12-26 18:08) [4][3] BOA_KAA © (26.12.03 17:53)
Ты бы лучше показал код try except... особенно внутри except end. А то у меня при трассировке исключений тоже не всегда показывается то место, где произошла ошибка.
← →
BOA_KAA (2003-12-26 18:13) [5]
> Sandman25 © (26.12.03 18:08) [4]
Код долгий :) А метод проверенный, отрихтованный и работающий (в другом проложении), взят без каких-либо изменений (у меня привычка к одинаковым именам :) )
← →
Sandman25 (2003-12-26 18:23) [6][5] BOA_KAA © (26.12.03 18:13)
Ну и как я тогда могу помочь? :)
Строку, где возникает ошибка, не показываешь, текст ошибки - тоже...
Попробуй тогда добиться, чтобы в try не возникало исключений.
{$I+} IOResult и все такое...
← →
BOA_KAA (2003-12-26 18:35) [7]> Sandman25 © (26.12.03 18:23) [6]
:)
Да нет, в самом деле в try, как ни странно, исключений не возникает :(
Ошибка возникает на выходе из метода :(
Кстати, на третьем компе (тут 2000) вместо External Exception выкидывается AV. Бред какой-то :(
Все-таки приведу вкрадце OpenGrid:
procedure TfrmMain.OpenGrid(AFileName, AVers: String);
var
fsFile: TFileStream;
ACol, ARow,
temp: Integer;
St: String;
b: Boolean;
begin
try
fsFile:=TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
(****************************** 1 *******************************)
fsFile.Read(temp, SizeOf(Integer));
fsFile.Read(AVers, temp);
(****************************** 2 *******************************)
fsFile.Read(temp, SizeOf(Integer));
sgData.ColCount:=temp;
fsFile.Read(temp, SizeOf(Integer));
sgData.RowCount:=temp;
fsFile.Read(temp, SizeOf(Integer));
sgData.FixedCols:=temp;
fsFile.Read(temp, SizeOf(Integer));
sgData.FixedRows:=temp;
(****************************** 3 *******************************)
for ACol:=0 to sgData.ColCount-1 do
begin
fsfile.Read(temp, SizeOf(Integer));
sgData.ColWidths[ACol]:=temp;
end;
for ARow:=0 to sgData.RowCount-1 do
begin
fsfile.Read(temp, SizeOf(Integer));
sgData.RowHeights[ARow]:=temp;
end;
(****************************** 4 *******************************)
fsfile.Read(temp, SizeOf(Integer));
sgData.GridLineWidth:=temp;
(****************************** 5 *******************************)
// тут читается куча булевских значений
(****************************** 6 *******************************)
for ACol:=0 to sgData.ColCount-1 do
for ARow:=0 to sgData.RowCount-1 do
begin
fsFile.Read(temp, SizeOf(Integer));
SetLength(St, temp);
fsFile.Read(St[1], temp);
sgData.Cells[ACol,ARow]:=St;
end;
fsFile.Free;
except
on E: Exception do
begin
if Assigned(fsFile) then
fsFile.Free;
E.Message:="Unable to open"#13#10+AFileName;
raise;
end;
end;
end;
Но метод то, что от него требуется делает :(
← →
Sandman25 (2003-12-26 18:44) [8]Вроде бы нашел.
Используй либо так:
fsFile := ...
try
...
finally
fsFile.Free;
end;
либо так:
fsFile := nil;
try
fsFile :=
finally
if Assigned(fsFile) then
fsFile.Free;
end;
А то получается ошибка при создании объекта, а fsFile содержит мусор, который "освобождается" в finally.
← →
BOA_KAA (2003-12-26 18:48) [9]Нееее, ну что ты, об этом я уже думал и пробовал :(
← →
Sandman25 (2003-12-26 18:50) [10][9] BOA_KAA © (26.12.03 18:48)
Что пробовал?
← →
BOA_KAA (2003-12-26 18:55) [11]То, что ты посоветовал. Использовать try-finally вместо try-except и проверка была на nil и т.д.
← →
Sandman25 (2003-12-26 19:00) [12]Странно. Надо дебагить...
Я ухожу, извини. Жена ждет :)
Страницы: 1 вся ветка
Текущий архив: 2004.01.13;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.01 c