RTTWaitThread = class(TThread)
......
procedure TWaitThread.MyError;
var i,j:integer;
begin   
  try
    try
      i:=100;
      j:=0;
      i:=i div j;
    except on E:Exception do
      MainForm.Memo1.Lines.Add('MyError : '+e.Message);//这边始终没有打印出来
    end;
  finally
    MainForm.Memo1.Lines.Add('MyError : finally');//这边是有打印出来的
  end;
end;procedure TWaitThread.Execute;
begin   
    MyError;
end;如上 代码。 为什么???

解决方案 »

  1.   

    TWaitThread = class(TThread)
    ......
    FMessage: String;
    procedure LogMessage;
    procedure TWaitThread.MyError;
    var i,j:integer;
    begin   
      try
        try
          i:=100;
          j:=0;
          i:=i div j;
        except on E:Exception do
          //MainForm.Memo1.Lines.Add('MyError : '+e.Message);//这边始终没有打印出来
          FMessage := 'MyError : '+e.Message;
          Synchronize(LogMessage);

        end;
      finally
        //MainForm.Memo1.Lines.Add('MyError : finally');//这边是有打印出来的
        FMessage := 'MyError : finally';
        Synchronize(LogMessage);
      end;
    end;procedure TWaitThread.Execute;
    begin   
        MyError;
    end;procedure TWaitThread.LogMessage;
    begin   
        MainForm.Memo1.Lines.Add(FMessage );
    end;
      

  2.   


    type
      TABThread = class(TThread)
      private
        { Private declarations }
      protected
        FMessage: String;
        procedure LogMessage;
        procedure Execute; override;
        procedure MyError;
      end;procedure TABThread.LogMessage;
    begin
      MainForm.Memo1.Lines.Add(FMessage );
    end;procedure TABThread.MyError;
    var i,j:integer;
    begin
      try
        try
          i:=100;
          j:=0;
          i:=i div j;
        except on E:Exception do
          begin
            FMessage:='MyError : '+e.Message;
            Synchronize(LogMessage);  //还是 打不出来啊
          end;
        end;
      finally
        //MainForm.Memo1.Lines.Add('MyError : finally');
        FMessage := 'MyError : finally';
        Synchronize(LogMessage);
      end;
    end;D6 不行啊...
      

  3.   

    我怀疑你是不出异常了?
    finally无论有没异常都会走到的
      

  4.   

    目前机器上没有D6没法测试,先看看有没有相关补丁未打上。这个有可能是Delphi处理线程异常不到位而导致根本没有执行到。
      

  5.   

    记得D6补丁要到update2(2002年4月),还有RTL update1(2002年6月)、RTL update2(2002年12月)
      

  6.   

    procedure TABThread.MyError;
    var i,j:integer;
    begin
      try
        try
          {$O+}
          i:=100;
          j:=0;
          i:=i div j;
          {$O-}
        except on E:Exception do
          begin
            FMessage:='MyError : '+e.Message;
            Synchronize(LogMessage);  //还是 打不出来啊
          end;
        end;
      finally
        //MainForm.Memo1.Lines.Add('MyError : finally');
        FMessage := 'MyError : finally';
        Synchronize(LogMessage);
      end;
    end;
      

  7.   

    to unsigned 僵哥:程序开发优化,{$O+},{$O-} ,你是如何想到的?以及相关的知识,是如何学习到的?
      

  8.   

    to unsigned 僵哥:那我要确保 线程里 “try...except...”中所有 异常都被抓到,是否就要在 “try的下一行” 和 “except的上一行” 处 ,加上{$O+}和{$O-}? 
      

  9.   

    同意僵哥的看法,你的程序i,j变量只是单纯赋值,程序不会执行的,楼主可以在i:=i div j; 
    后加showmessage(inttostr(I));程序必会执行。
      

  10.   

    你那3行代码根本不会被编译进exe,因为编译器会优化代码,像这样完全没有任何用处的代码会被优化掉。
      

  11.   

    方法至少有两个
    1、在调试时被优化掉的代码是不能设置断点的(设置断点时IDE显示颜色会不一样),因为根本执行不到
    2、人工分析代码
      

  12.   

    大致上没用的代码会被优化
    但是实际上好像有些有用的代码也会被优化,可能IDE有点问题,你如果觉得你写的代码都有用的话,可以不用优化,project->options->compiler->optimization去掉钩就行了
      

  13.   

    比如定义一个变量,i
    然后只进行如下操作
    i:=10;
    i:=20;
    则后面一句有效,前面那一句就被忽略掉而不执行了.