为什么raise不能重引发错误?为什么我的Try..Excepte不能捕获raise的错误消息? ( 积分: 50 )

  • 主题发起人 主题发起人 GrassDragon
  • 开始时间 开始时间
G

GrassDragon

Unregistered / Unconfirmed
GUEST, unregistred user!
我的代码是这样的.
program Project;
...
begin
try
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
except
on e: exception do
begin
showmessage(e.Message);
Application.Terminate;
end;
end;

unit Unit1;
...

procedure TForm1.FormCreate(Sender: TObject);
var Open_File: TextFile;
begin
try
Rewrite(Open_File);
except
on e: exception do
raise exception.Create('test');
end;
end;

但是程序运行到"on e: exception do raise exception.Create('test');"一句时,仍然弹出标准的window错误提示窗口,并且不能被Project的try...Except所捕获我重引发的exception。

这是为什么?
我测试了一下,估计和Application有关。
 
我现在是这样处理的,可以重引发了,也能捕获了:
program Project代码不变;

{unit Unit1}
procedure TForm1.FormCreate(Sender: TObject);
var Open_File: TextFile;
begin
Application.OnException := AppException;
try
Rewrite(Open_File);
except
on e: exception do
raise exception.Create('test');
end;

procedure TForm1.AppException(Sender: TObject
E: Exception);
begin
raise exception.Create(e.Message);
end;

我的问题是:
1、到底是什么原因导致不能重引发和捕获我raise的exception.Create('test');
2、这样处理好不好?
3、通常的处理办法是怎样的?
4、Application.OnException和raise之间有什么关系?什么时候该try...except,什么时候该用Application.OnException?
 
procedure TApplication.Run;
begin
FRunning := True;
try
AddExitProc(DoneApplication);
if FMainForm <> nil then
begin
case CmdShow of
SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;
SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized;
end;
if FShowMainForm then
if FMainForm.FWindowState = wsMinimized then
Minimize else
FMainForm.Visible := True;
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
end;
finally
FRunning := False;
end;
end;

看了这个我想你就应该明白了.
 
我raise except的时候,Appliction.run还没有执行呢.
我试过,把application.run放到try..except之后,仍然是这样.
还是不太明白,请赐教!
 
我也有此问题,所以顶一下。
 
OnException是处理VCL消息时引发的异常,常见的,用户输入了一个不合法的日期,你用try的话你打算写到什么地方?
 
Sorry 原来没认真看,现在搞定了:

在VCL里面追到了,原来是这样

procedure TCustomForm.DoCreate;
begin
if Assigned(FOnCreate) then
try
FOnCreate(Self)
// 这里调用我们的 OnCreate 事件
except
if not HandleCreateException then // 异常被这个函数封住了,看这个函数返回是否为True
raise;
end;
if fsVisible in FFormState then Visible := True;
end;

function TCustomForm.HandleCreateException: Boolean;
begin
Application.HandleException(Self);
Result := True
// 日哦,永远为 True ,所以在 OnCreate 里面的异常永远没机会Raise 出来,异常被 Application.HandleException(Self) 这个函数抓走了.

end;


好了,问题就是这样,本来也吓我一跳
 
后退
顶部