![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Исключение при создании формы.
GuAV © (2005-02-02 21:56:00)Такой вот код:
try
Form1 := TForm1.Create(nil);
except
on E: Exception do
begin
Application.ShowException(E);
Result := 1;
Exit;
end;
end;
Однако, при возникновении исключения форма всё равно создаётся и код в ехсерт не выполняется.
Можно ли как-нибудь выключить эту фичу ?
Эта особенность распространяется тоько на конструкторы форм или ещё на что-то ?
jack128 (2005-02-03 06:08:00) [1]Ну вот такой код к краху приложения не приводит
library MyDll;
uses
SysUtils,
Classes;
{$R *.RES}
function TestException: Integer; safecall; export;
begin
raise Exception.Create('Test');
Result := -1
end;
exports
TestException;
begin
end.
program MyApp;
{$APPTYPE CONSOLE}
uses
SysUtils;
function Test: Integer; safecall; external 'MyDll.dll' name 'TestException';
begin
try
test
except
on E: Exception do
WriteLn(E.Message);
end;
ReadLn;
end.
Petr V. Abramov (2005-02-03 04:02:00) [2]> Если в DLL на Delphi возникает исключение, то можно ли его вообще "выпускать" из DLL ?
Если build with Runtime packeges - можно. Если нет - точно не нужно.
GuAV (2005-02-03 01:18:00) [3]Так получается, что приложение использующее эту dll неадекватно реагирует на исключения - оно считает вызов функции успешным в случае исключения.
Кстати, такой вопрос:
Если в DLL на Delphi возникает исключение, то можно ли его вообще "выпускать" из DLL ? Понятно, что текст исключения не-Delphi приложение не покажет. Но не приведёт ли неожиданное искючение к нарушению работы программы ?
Anatoly Podgoretsky (2005-02-03 00:52:00) [4]Вот погашеное
except
Application.HandleException(Self);
end;
А вот повторно возбужденное
except
if not HandleCreateException then
raise;
end;
GuAV (2005-02-03 00:43:00) [5]Пришлось написать так, чтобы форма освобождалась:
try
Application.CreateForm(TForm1, Form1)
except
on E: Exception do
begin
Application.ShowException(E);
Form1.Free;
Result := False;
Exit;
end;
end;
> Ну если нужно, то другое дело, но вот пример глушения
> исключения приведен.
Не понял.
Anatoly Podgoretsky (2005-02-03 00:38:00) [6]Ну если нужно, то другое дело, но вот пример глушения исключения приведен.
GuAV (2005-02-03 00:26:00) [7]jack128 © (03.02.05 0:03) [2]
Да, в OnCreate.
Спасибо. Не сообразил про Ctrl+Click
procedure TCustomForm.DoCreate;
begin
if Assigned(FOnCreate) then
try
FOnCreate(Self);
except
if not HandleCreateException then
raise;
end;
if fsVisible in FFormState then Visible := True;
end;
function TCustomForm.HandleCreateException: Boolean;
begin
Application.HandleException(Self);
Result := True;
end;
HandleCreateException - динамический метод, поэтому что делать - теперь понятно.
Anatoly Podgoretsky © (02.02.05 23:40) [1]
> И так делать не надо
Почему ?
Мне нужно в Result иметь 1 если получилось исключение, а исключения "выпускать" из dll не нужно. Причём не важно в OnCreate искл-е или где ещё.
jack128 (2005-02-03 00:03:00) [8]GuAV © (02.02.05 21:56)
Однако, при возникновении исключения форма всё равно создаётся и код в ехсерт не выполняется.
Где именно исключение возникает? Если в событии OnCreate, то в пятерке эту фитчу нельзя отключить..Выше не знаю..
procedure TCustomForm.DoCreate;
begin
if Assigned(FOnCreate) then
try
FOnCreate(Self);
except
Application.HandleException(Self);
end;
if fsVisible in FFormState then Visible := True;
end;
Anatoly Podgoretsky (2005-02-02 23:40:00) [9]Погашено в OnCreate И так делать не надо
Form1 := TForm1.Create(nil);
try
except
on E: Exception do
begin
Application.ShowException(E);
Result := 1;
Exit;
end;
end;