Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.024 c
8-37809
Rastafarra
2003-09-07 22:37
2004.01.13
распознование цифр


3-37525
Ю.Ф.
2003-12-16 15:18
2004.01.13
Упаковка БД типа Парадокс или FoxPro


6-37829
Bill
2003-11-11 03:42
2004.01.13
Cannot allocate socket.


14-37868
Maga MS
2003-12-21 18:57
2004.01.13
Папка-ярлык или феномен


1-37761
Alexander_spb
2003-12-29 20:07
2004.01.13
TCanvas