主界面线程里创建了一个子线程,子线程函数会抛出异常但没有处理,主线程里代码或者WinMain函数可以捕获该异常吗?

ooolinux 2022-12-09 18:52:56

我记得线程好像有独立的栈空间?是否意味着函数调用栈也是分开的?

...全文
202 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2022-12-10
  • 打赏
  • 举报
回复

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;
ooolinux 2022-12-10
  • 举报
回复
@日立奔腾浪潮微软松下联想 OnTerminate 是在线程运行结束的时候才触发,不是线程运行过程中
  • 举报
回复
@ooolinux 未处理的异常则线程终止
ooolinux 2022-12-11
  • 举报
回复
@日立奔腾浪潮微软松下联想 那跟由上级函数捕获异常也差不多,当前函数都会终止
6条回复
tanqth 2022-12-10
  • 打赏
  • 举报
回复
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;

没有反应的

ooolinux 2022-12-10
  • 举报
回复
@tanqth 我看看
tanqth 2022-12-10
  • 打赏
  • 举报
回复

子线程里的异常如果没有在线程内去处理,主线程好像是捕获不了的。

ooolinux 2022-12-10
  • 举报
回复
@tanqth 我的代码好像也不行
tanqth 2022-12-11
  • 举报
回复
@ooolinux 所以,还是尽可能在线程内做好异常处理。
ooolinux 2022-12-11
  • 举报
回复
@tanqth 没错
  • 打赏
  • 举报
回复

如果
try
{
// 建立线程
}
catch (...)
{
}
就可以捕捉到,参考CB生成的主程序部分

ooolinux 2022-12-10
  • 举报
回复
@日立奔腾浪潮微软松下联想 我贴的代码似乎不行

5,943

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧