Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Грамотная обработка ошибки [D6, Win2k]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо