Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1149559496
Василий
2006-06-06 06:04
2006.06.25
Прозрачность Textout


3-1146076512
makvell
2006-04-26 22:35
2006.06.25
Исключения


2-1149662641
irena
2006-06-07 10:44
2006.06.25
varchar(1024) не сохраняется при использовании TDBMemo


15-1149082783
Zeqfreed
2006-05-31 17:39
2006.06.25
Javascript + php, вопрос скорее по первому


15-1148799929
Ega23
2006-05-28 11:05
2006.06.25
&amp;#209; &amp;#196;&amp;#237;ё&amp;#236; &amp;#240;&amp;#238;&amp;#230;&amp;#228;&amp;#229;&amp;#237;&amp;#232;&amp;#255;! 28 мая





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