Форум: "Основная";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
ВнизГрамотная обработка ошибки Найти похожие ветки
← →
Neo Trinitron © (2006-05-16 18:07) [0]В конструкторе формы открываю набор данных. Как сделать так чтобы в случае ошибки набора данных выдалось сообщение об ошибке и форма не создалась?
← →
Алхимик © (2006-05-16 18:14) [1]try
<Критичное деяние>
except
<Обработка критичного деяния>
end
← →
MetalFan © (2006-05-16 18:26) [2]в OnCreate формы
raise Exeption.create("Failed!")
при создании формыtry
FForm1 := TForm1.create(nil);
try
....
finally
FForm1.free;
end;
except
on E: Exception ShowMessage(E.Message)
end
видимо както так
← →
Algol (2006-05-16 18:31) [3]
> В конструкторе формы открываю набор данных. Как сделать
> так чтобы в случае ошибки набора данных выдалось сообщение
> об ошибке и форма не создалась?
Дак внутри конструктора форма уже создана. Сделать что бы она совсем не создалась - не получится. Но если вызвать эксепшн, то автоматически вызовется деструктор, который уничтожит недосозданный объект.
← →
jack128 © (2006-05-16 18:40) [4]Algol (16.05.06 18:31) [3]
Но если вызвать эксепшн, то автоматически вызовется деструктор, который уничтожит недосозданный объект.
не всегда. только если function TCustomForm.HandleCreateException: Boolean; dynamic; вернет False;
← →
Neo Trinitron © (2006-05-16 18:45) [5]в конструкторе формы пишу
try
Query1.Open;
except
Raise Exception.Create("Ошибка");
end;
создаю форму так:
try
Form1:=TForm1.Create(Self);
Form1.ShowModal;
finally
Form1.Free;
end;
Форма всё равно создаётся...
← →
Algol (2006-05-16 19:11) [6]
> не всегда. только если function TCustomForm.HandleCreateException:
> Boolean; dynamic; вернет False;
Речь идет о конструкторе а не о OnCreate
← →
Neo Trinitron © (2006-05-16 19:15) [7]Речь идёт о OnCreate...
← →
Algol (2006-05-16 19:18) [8]Сравните фразы
> Речь идёт о OnCreate...
и
> в конструкторе формы пишу
Определитесь наконец, где находится ваш код? В конструкторе или в OnCreate?
← →
Neo Trinitron © (2006-05-16 19:19) [9]в OnCreate
← →
Algol (2006-05-16 19:28) [10]Если это не кретично, то лучше код перенести в конструктор, тогда проблем с эксепшенами не будет.
← →
Neo Trinitron © (2006-05-16 19:44) [11]Извините меня неграмотного, но в конструктор это как? Всегда думал что это метод OnCreate...
← →
Leonid Troyanovsky © (2006-05-16 20:26) [12]
> Neo Trinitron © (16.05.06 19:44) [11]
> Извините меня неграмотного, но в конструктор это как?
RTFM: Delphi help. Overriding the constructor.
> Всегда думал что это метод OnCreate...
А это свойство, называемое событием.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2006-05-16 20:30) [13]
> 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.
← →
TUser © (2006-05-16 20:51) [14]
> Leonid Troyanovsky © (16.05.06 20:30) [13]
Почему? Вероятность возникновения ошибки в конструкторе TForm1 мала. И лучше уж ей Owner"а сделать, или почему я не прав?
← →
Leonid Troyanovsky © (2006-05-16 21:13) [15]
> TUser © (16.05.06 20:51) [14]
> И лучше уж ей Owner"а сделать, или почему я
Зачем оверхед с owner, если после модального
показа она уничтожается.
--
Regards, LVT.
← →
Neo Trinitron © (2006-05-17 11:04) [16]Извиняюсь, совершенно не понял конструкцию
with TForm1.Create(nil) do
try
..
.. := ShowModal;
..
finally
Free;
end;
Сделал так, всё равно создаётся при ошибке...
with TForm1.Create(nil) do
try
ShowModal;
finally
Free;
end;
← →
tesseract © (2006-05-17 11:12) [17]
> 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:19) [18]tesseract, мне кажется что Вы написали глупость...
← →
Плохиш © (2006-05-17 11:34) [19]
> Neo Trinitron © (17.05.06 11:04) [16]
> Сделал так, всё равно создаётся при ошибке...
Код из OnCreate в конструктор уже перенёс?
← →
tesseract © (2006-05-17 11:37) [20]
> 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);
Хотя не проще-ли открывать набор данных не в конструкторе формы, а перед её созданием?????
← →
Neo Trinitron © (2006-05-17 11:47) [21]>Хотя не проще-ли открывать набор данных не в конструкторе формы, а перед её созданием?????
Теперь свожусь к мысли что так действительно проще. Думал сделать ещё проще, но как видно, проще не получится...
← →
MetalFan © (2006-05-17 12:04) [22]
> exept
> on E:Exeption do fmCreate:=false
> end;
зачем так усложнять?!except
fmCreate := false;
end;
← →
tesseract © (2006-05-17 12:09) [23]
> зачем так усложнять?!
не во всех случая ошибка таким образом блокируется (могу ошибаться).
← →
vl_chel © (2006-05-17 13:09) [24]Хороший совет - никогда не генерировать исключение в конструкторе
Form1 := TForm1.Create(Application)
если в конструкторе генерируется искючение то переменной типа клас не присвоится ссылка на экземпляр класса
← →
MetalFan © (2006-05-17 13:15) [25]
> если в конструкторе генерируется искючение то переменной
> типа клас не присвоится ссылка на экземпляр класса
а будет ли он создан, если в конструкторе произошло исключение?
← →
vl_chel © (2006-05-17 13:23) [26]>>а будет ли он создан, если в конструкторе произошло исключение?
останется висящий где-то в памяти объект
Главное чтобы оно из него не вышло, ведь исключение попавшее в блок except снимается с обработки
В паскале (в отличие от плюсов) принята ссылочная объектная модель
те память под обьект выделяется до выполнения кода разработанного Вами конструктора объекта, соответственно если не запомнить ссылку на эту память (собственно это и называетя объектом) то будет невозможно вызвать ни один из его методов.
Ваша проблема решается проще: создайте поле или свойство в классе которое будет отвечать за корректное создание набора данных, после выполнения конструктора проверяете это поле и если все Ок показываем форму если нет то показываем сообщение об ошибке
← →
Игорь Шевченко © (2006-05-17 13:37) [27]
procedure TfChild.FormCreate(Sender: TObject);
begin
try
Exclude (FFormState, fsVisible);
raise Exception.Create ("Gotcha!");
except
Close;
end;
end;
Для полноты надо еще куда-то текст exception передавать
← →
tesseract © (2006-05-17 15:58) [28]
> создайте поле или свойство в классе которое будет отвечать
> за корректное создание набора данных, после выполнения конструктора
> проверяете это поле и если все Ок показываем форму если
> нет то показываем сообщение об ошибке
идея состояла в том, чтобы класс не создавался, если этот же класс не смог открыть набор данных.
А так он создасться и разрушится (и память кстати до завершения программы из кучи в винду не вернётся, что логично).
← →
Romkin © (2006-05-17 17:15) [29]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."
Читааать!
← →
MetalFan © (2006-05-17 17:50) [30]
> Romkin © (17.05.06 17:15) [29]
вот собстно часть вопросов и отпасть должны)
← →
tesseract © (2006-05-17 20:55) [31]
> "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 22:04) [32]
> не уверен? что это произойдёт при перехвате exeption.
не произойдет. имхо - нужно использовать тот вариант, что я с самого начала предлагал
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.01 c