DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wpxlhy007
今日帖子: 1
在线用户: 6
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 tuesdays (Tuesday) ▲▲△△△ -
注册会员
2019/3/14 9:19:49
标题:
线程中的raise 浏览:284
加入我的收藏
楼主: function test: string;
begin
  // ....
  if false then
     raise;
end;

这个函数, 假如在主线程中不用try直接调用也是能够弹出错误.. 
但在线程中如果不用try, 它就卡住死掉了. 

这如何是好? 怎么让它自动错误到主线程并且退出??
----------------------------------------------
delphi界我写python最强, python界我写delphi最强. 写自己的代码, 让别人去运行吧.
作者:
男 bbnn38 (伟大的咸鱼) ▲▲▲▲△ -
注册会员
2019/3/14 9:30:16
1楼: function test: string;
begin
TThread.Queue(nil,
          procedure
          begin
          // ....
          if false then
          raise;
          end);
end;

以下引用自别人:
TThread.Queue和TThread.Synchronize的区别,
效果上:二者的作用都是让业务代码在主线程中执行,差别: Synchronize是阻塞,Queue是非阻塞
----------------------------------------------
-
作者:
男 tuesdays (Tuesday) ▲▲△△△ -
注册会员
2019/3/14 9:34:57
2楼: 谢谢, 我试试.
----------------------------------------------
delphi界我写python最强, python界我写delphi最强. 写自己的代码, 让别人去运行吧.
作者:
男 tuesdays (Tuesday) ▲▲△△△ -
注册会员
2019/3/14 9:35:15
3楼: TThread.Queue(nil,
          procedure
          begin
          // ....
          if false then
          raise;
          end);

这一段, 我可以用个函数封装起来吗?
----------------------------------------------
delphi界我写python最强, python界我写delphi最强. 写自己的代码, 让别人去运行吧.
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/3/14 9:43:23
4楼: 为啥不考虑用返回值去标识错误?为啥出错就必须弹异常?
到处抛异常的代码真c蛋
----------------------------------------------
--
作者:
男 tuesdays (Tuesday) ▲▲△△△ -
注册会员
2019/3/14 9:51:37
5楼: @bahamut8348

返回值我也考虑过, 但比如那函数返回string, 你怎么返回错误? 
空值表示错误? 

那你仍然不知道错误原因..
----------------------------------------------
delphi界我写python最强, python界我写delphi最强. 写自己的代码, 让别人去运行吧.
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2019/3/14 10:20:12
6楼: // Quelle: http://edn.embarcadero.com/article/10452

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMyThread = class(TThread)
  private
    FException: Exception;
    procedure DoHandleException;
  protected
    procedure Execute; override;
    procedure HandleException; virtual;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  // Create an instance of the TMyThread
  with TMyThread.Create(True) do
  begin
    FreeOnTerminate := True;
    Resume; 
  end;
end;

{ TMyThread }

procedure TMyThread.DoHandleException;
begin
  // Cancel the mouse capture
  if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
  // Now actually show the exception
  if FException is Exception then
    Application.ShowException(FException)
  else
    SysUtils.ShowException(FException, nil);
end;

procedure TMyThread.Execute;
var
  a: Integer;
  b: Integer;
begin
  inherited;
  FException := nil;
  try
    // raise an Exception
    b := 0;
    a := 42 div b;
    Messagebox(0, PansiChar(IntToStr(a)), 'fehler', 0)
    //raise Exception.Create('I raised an exception');
  except
    HandleException;
  end;
end;

procedure TMyThread.HandleException;
begin
  // This function is virtual so you can override it
  // and add your own functionality.
  FException := Exception(ExceptObject);
  try
    // Don't show EAbort messages
    if not (FException is EAbort) then
      Synchronize(DoHandleException);
  finally
    FException := nil;
  end;

end;

end.
----------------------------------------------
Delphi4Linux交流群:734515869 http://www.cnblogs.com/rtcmw
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行41.01563毫秒 RSS