procedure TForm1.cmdExceptionClick(Sender: TObject);
var
  i:Integer;
  j:Integer;
  m:double;
begin
  try
    i:=100;
    j:=0;
    m:=i/j;
    showmessage('test');
  except
    showmessage('error!');
  end;
end;
这是一段测试异常处理的代码,令人不解的是,执行后出现的提示居然是“test”,不知何故?

解决方案 »

  1.   

    var
      i:Integer;
      j:Integer;
      m:double;
    begin
      try
        i:=100;
        j:=0;
        m:=i/j;
        edit1.Text := floattostr(m);  //在这加一句无关紧要的就可以了
        showmessage('test');
      except
        showmessage('error!');
      end;
    end;
      

  2.   

    不奇怪, 如果你修改如下, 就會出錯了:
        m:=i/j;
        showmessage('test ' + FloatToStr(m));編繹器檢查到你的函數沒用到m, 就邊編繹
        i:=100;
        j:=0;
        m:=i/j;
    都沒有了!!
      

  3.   

    var
      i:Integer;
      j:Integer;
      m:double;
    begin
      try
        i:=100;
        j:=0;
        m:=i/j;
        showmessage(FloatToStr(m));
      except
        showmessage('error!');
      end;
    end;因为你没有显示m的数据的原因吧!
      

  4.   

    完全行的, 因为你原来的代码中,并没有要使用m的地方,
    编译程序在编译代码时, 会有一个优化代码的工作(参见《编译原理》)
    因此会忽略m:=i/j,在m := i / j ;后面加一句引用m的代码, 为的就是让m:=i/j有效。修改代码:
    var
      i:Integer;
      j:Integer;
      m:double;
      s: string;
    begin
      try
        i:=100;
        j:=0;
        m:=i/j;
        s := floattostr(m);
        showmessage('test');
      except
        showmessage('error!');
      end;
    end;
    ----------------------------------------------------------------
    原贴内容:
    不行啊!我把edit1.Text := floattostr(m);  //在这加一句无关紧要的就可以了换成j:=100;结果还是显示'test'。你的代码在你的环境下可以捕捉到错误吗?