5,943
社区成员
发帖
与我相关
我的任务
分享我记得线程好像有独立的栈空间?是否意味着函数调用栈也是分开的?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMyThread *th;
try
{
th=new TMyThread(false);
}
catch(...)
{
ShowMessage("有一个线程异常");
}
}
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
throw Exception("一个线程异常");
}
//---------------------------------------------------------------------------
这样就可以了:
procedure TForm1.Button1Click(Sender: TObject);
var
Thread1: TThread;
begin
Thread1 := TThread.CreateAnonymousThread(
procedure
var
i, j: integer;
begin
i := 0;
j := 3 div i;
end
);
Thread1.OnTerminate := CheckThreadException;
Thread1.Start;
end;
procedure TForm1.CheckThreadException(Sender: TObject);
begin
if (Sender is TThread) and (TThread(Sender).FatalException <> nil) then
ShowMessage(Exception(TThread(Sender).FatalException).Message);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TThread.CreateAnonymousThread(
procedure
var
i:Integer;
begin
//i:=Round( 3/0);
raise Exception.Create('Error Message');
end).Start;
end;
procedure TForm1.ExceptionHandler(Sender: TObject; E: Exception);
begin
ShowMessage(E.Message);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := ExceptionHandler;
end;
没有反应的
子线程里的异常如果没有在线程内去处理,主线程好像是捕获不了的。
如果
try
{
// 建立线程
}
catch (...)
{
}
就可以捕捉到,参考CB生成的主程序部分