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

Вниз

Почему вываливается 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
8-37802
tOester
2003-09-09 14:48
2004.01.13
рисование в jpg файле


1-37638
Эли
2003-12-27 13:20
2004.01.13
Добавить иконку в EXE файл


3-37581
Vanoshka
2003-12-17 11:24
2004.01.13
Транзакции в InterBase


3-37541
Ditrix
2003-12-16 09:59
2004.01.13
использование Interbase данных без установки IB


4-37975
STPiter
2003-11-07 18:22
2004.01.13
Хук на клаву. Глюки в ворде





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