![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Грамотная обработка ошибки [D6, Win2k]
Neo Trinitron © (2006-05-16 18:07:00)В конструкторе формы открываю набор данных. Как сделать так чтобы в случае ошибки набора данных выдалось сообщение об ошибке и форма не создалась?
MetalFan (2006-05-17 22:04:00) [1]
> не уверен? что это произойдёт при перехвате exeption.
не произойдет. имхо - нужно использовать тот вариант, что я с самого начала предлагал
tesseract (2006-05-17 20:55:00) [2]
> "If an exception is raised during execution of a constructor
> that was invoked on a class reference, the Destroy destructor
> is automatically called to destroy the unfinished object.
> "
не уверен? что это произойдёт при перехвате exeption.
MetalFan (2006-05-17 17:50:00) [3]
> Romkin © (17.05.06 17:15) [29]
вот собстно часть вопросов и отпасть должны)
Romkin (2006-05-17 17:15:00) [4]vl_chel © (17.05.06 13:23) [26] Читаем только первый абзац?
"If an exception is raised during execution of a constructor that was invoked on a class reference, the Destroy destructor is automatically called to destroy the unfinished object."
Читааать!
tesseract (2006-05-17 15:58:00) [5]
> создайте поле или свойство в классе которое будет отвечать
> за корректное создание набора данных, после выполнения конструктора
> проверяете это поле и если все Ок показываем форму если
> нет то показываем сообщение об ошибке
идея состояла в том, чтобы класс не создавался, если этот же класс не смог открыть набор данных.
А так он создасться и разрушится (и память кстати до завершения программы из кучи в винду не вернётся, что логично).
Игорь Шевченко (2006-05-17 13:37:00) [6]
procedure TfChild.FormCreate(Sender: TObject);
begin
try
Exclude (FFormState, fsVisible);
raise Exception.Create ('Gotcha!');
except
Close;
end;
end;
Для полноты надо еще куда-то текст exception передавать
vl_chel (2006-05-17 13:23:00) [7]>>а будет ли он создан, если в конструкторе произошло исключение?
останется висящий где-то в памяти объект
Главное чтобы оно из него не вышло, ведь исключение попавшее в блок except снимается с обработки
В паскале (в отличие от плюсов) принята ссылочная объектная модель
те память под обьект выделяется до выполнения кода разработанного Вами конструктора объекта, соответственно если не запомнить ссылку на эту память (собственно это и называетя объектом) то будет невозможно вызвать ни один из его методов.
Ваша проблема решается проще: создайте поле или свойство в классе которое будет отвечать за корректное создание набора данных, после выполнения конструктора проверяете это поле и если все Ок показываем форму если нет то показываем сообщение об ошибке
MetalFan (2006-05-17 13:15:00) [8]
> если в конструкторе генерируется искючение то переменной
> типа клас не присвоится ссылка на экземпляр класса
а будет ли он создан, если в конструкторе произошло исключение?
vl_chel (2006-05-17 13:09:00) [9]Хороший совет - никогда не генерировать исключение в конструкторе
Form1 := TForm1.Create(Application)
если в конструкторе генерируется искючение то переменной типа клас не присвоится ссылка на экземпляр класса
tesseract (2006-05-17 12:09:00) [10]
> зачем так усложнять?!
не во всех случая ошибка таким образом блокируется (могу ошибаться).
MetalFan (2006-05-17 12:04:00) [11]
> exept
> on E:Exeption dofmCreate:=false
> end;
зачем так усложнять?!
except
fmCreate := false;
end;
Neo Trinitron (2006-05-17 11:47:00) [12]>Хотя не проще-ли открывать набор данных не в конструкторе формы, а перед её созданием?????
Теперь свожусь к мысли что так действительно проще. Думал сделать ещё проще, но как видно, проще не получится...
tesseract (2006-05-17 11:37:00) [13]
> tesseract, мне кажется что Вы написали глупость...
сорри недочитал.
// итак пробуем создать
var fmCreate:boolean;
fmcreate:=true;
try
// Exeption у тебя должен сработать в конструкторе
Form1:=Tform1.create(nil);
// При ошибке выполнится этот код
exept
on E:Exeption do fmCreate:=false
end;
// если fmcreate то форма создана, то можно её показать
if fmCrete then result:=form1.showmodal;
// и finally
FreeAndNil(form1);
Хотя не проще-ли открывать набор данных не в конструкторе формы, а передеё созданием?????
Плохиш (2006-05-17 11:34:00) [14]
> Neo Trinitron © (17.05.06 11:04) [16]
> Сделал так, всё равно создаётся при ошибке...
Код из OnCreate в конструктор уже перенёс?
Neo Trinitron (2006-05-17 11:19:00) [15]tesseract, мне кажется что Вы написали глупость...
tesseract (2006-05-17 11:12:00) [16]
> with TForm1.Create(nil) do
> try ShowModal;
> finally
> Free; end;
Еще бы. Сообщение об ошибке обрабытывается после exept.
finally блок служит для кода который должен по любому выполнится, как в случае ошибки так и без неё.
Form1:=Tform1.create(nil);
try
try
Form1.ShowModal;
except
on E:Execpiton do ShowMessage('Error while show Form1');
finally
Form1.Free;
end;
end;
Neo Trinitron (2006-05-17 11:04:00) [17]Извиняюсь, совершенно не понял конструкцию
with TForm1.Create(nil) do
try
..
.. := ShowModal;
..
finally
Free;
end;
Сделал так, всё равно создаётся при ошибке...
with TForm1.Create(nil) do
try
ShowModal;
finally
Free;
end;
Leonid Troyanovsky (2006-05-16 21:13:00) [18]
> TUser © (16.05.06 20:51) [14]
> И лучше уж ей Owner'а сделать, или почему я
Зачем оверхед с owner, если после модального
показа она уничтожается.
--
Regards, LVT.
TUser (2006-05-16 20:51:00) [19]
> Leonid Troyanovsky © (16.05.06 20:30) [13]
Почему? Вероятность возникновения ошибки в конструкторе TForm1 мала. И лучше уж ей Owner'а сделать, или почему я не прав?
Leonid Troyanovsky (2006-05-16 20:30:00) [20]
> Neo Trinitron © (16.05.06 18:45) [5]
> try
> Form1:=TForm1.Create(Self);
> Form1.ShowModal;
> finally
> Form1.Free;
> end;
Высечь на стене:
with TForm1.Create(nil) do
try
..
.. := ShowModal;
..
finally
Free;
end;
--
Regards, LVT.