比如:
窗体1ShowModal出来了一个窗口,然后这个窗口的某个事件抛出的异常,我想在窗体1的处理代码中捕获都不行呢
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Form2 := TForm2.Create(Application);
Form2.ShowModal;
except
on e:exception do
begin
ShowMessage(e.Message);
end;
end;
end;procedure TForm2.Button1Click(Sender: TObject);
begin
raise Exception.Create('Test');
end;我测试了,好像在TForm1中捕获不到TForm2中的异常啊。
窗体1ShowModal出来了一个窗口,然后这个窗口的某个事件抛出的异常,我想在窗体1的处理代码中捕获都不行呢
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Form2 := TForm2.Create(Application);
Form2.ShowModal;
except
on e:exception do
begin
ShowMessage(e.Message);
end;
end;
end;procedure TForm2.Button1Click(Sender: TObject);
begin
raise Exception.Create('Test');
end;我测试了,好像在TForm1中捕获不到TForm2中的异常啊。
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure ApplicationEvents1Exception(Sender: TObject; E: Exception);
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
try
Form2 := TForm2.Create(Application);
Form2.ShowModal;
except
on e:exception do
begin
ShowMessage(e.Message);
end;
end;
end;procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
ShowMessage('捕获到的异常: ' + E.Message);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := ApplicationEvents1Exception;
end;
try
Form2.ShowModal;
except
on e:exception do
begin
ShowMessage(e.Message);
end;
end;
//------一般来说,应该这样写,楼主那样写,编译器会有Hints.
或者下面这样写个人感觉更好.
Form2 := TForm2.Create(nil);
try
try
Form2.ShowModal;
except
on e:exception do
begin
ShowMessage(e.Message);
end;
end;
finally
Form2.Free;
end;
异常的。我其实想这样写
Application.Initialize;
try
if UserLogin then
begin
Application.CreateForm(TDM_Skin, DM_Skin);
Application.CreateForm(TDM_Data, DM_Data);
Application.CreateForm(TForm_Main, Form_Main);
Application.Run;
end;
except
on e:Exception do
begin
LogError(e.Message);
ShowErrMsg(0, e.Message);
end;
end;
我的本意是在一个地方捕捉到所有异常,看了一下vcl的源码,这种想法是不可能的。Run方法自己都有处理异常,
所以,有异常都不会继续发上来了。
delphi这种处理有利也有弊啊,如果不做处理的话,新手编个程序稍微有个异常,程序就当掉了,但有时候程序员
的确想全部控制procedure TApplication.Run;
...
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
...
它已经处理了
不,就像上面的代码,我需要先显示登录窗口,再显示主窗口
我的UserLogin是个函数,就是showmodal一个登录窗口
...
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
...
它已经处理了