Главная страница
    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.48 MB
Время: 0.01 c
3-37546
OlegM
2003-12-16 06:30
2004.01.13
Как проверить что Blob поле пустое


1-37749
Titeha
2003-12-30 08:20
2004.01.13
Изменения в TComboBox и TDateTimePicker


14-37890
Drakon
2003-12-21 17:47
2004.01.13
Бесплатная альтернатива Delphi


3-37517
Дима
2003-12-16 19:29
2004.01.13
Как отсортировать таблицу (Paradox) по определённому полю?


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