i:=1;j:=0;
try
  try
    i:=i div j;
  except
    showmessage(vartostr(i));
    showmessage('is this ok?');
    showmessage('except');
  end;
finally
  showmessage('finally');
end;
显示结果为:
1
is this ok?
except
finally
但是把showmessage(vartostr(i));这一句去掉就只显示finally了,请问是为什么?
为什么有的时候嵌套的except中的语句不执行。此问题同样出现在except中嵌套finally的情况,大家可以试一下。

解决方案 »

  1.   

    那是个很特殊的异常,delphi已经为你的异常作处理了,所以酒会出现finally了
    这样来测设try
      try
        raise exception.Create('yichang ');
      except
        showmessage(vartostr(i));
        showmessage('is this ok?');
        showmessage('except');  end;
    finally
      showmessage('finally');
      

  2.   

    这应该是delphi的优化器的作用,如果你没有引用i,即i只出现在等号的左边,而没有出现在右边或者最为其他的引用参数,他会忽略跳过。你在最后加一个j:=i;试试就知道了
      

  3.   

    同意theone_jxm() 。
    i:=1;j:=0;
    try
      try
        i:=i div j;   //这里抛出异常
      except
        showmessage(vartostr(i));
        showmessage('is this ok?');
        showmessage('except');
      end;
    finally
      showmessage('finally');
    end;
      

  4.   

    我问这个问题的目的在于如何让自己写的代码即执行except又执行finally
    编译器优化论也好,delphi已经处理论也好,都不能知道自己写的语句是否执行except部分是吗?
    必须自己调试才能得到结果,是吗?
      

  5.   

    theone_jxm()说的不对,你就是取消debugger options下的integrated debugging选项取消,还是只显示finally,请注意程序运行时,提示value assigned to 'i' never used,value assigned to 'j' never used,我们可以猜测i:=i div j;根本没有执行。
      

  6.   

    对,是delphi的优化器的作用。同意firetoucher(风焱)的。两个星,羡慕!!
      

  7.   

    把j:=1;i:=2;
    放到finally的语句块外面也照样提示
    value assigned to 'i' never used,value assigned to 'j' never used
    我很迷惑,呵呵。
    tjff2000(fengyun),你说呢?
      

  8.   

    firetoucher(风焱)牛人!长知识!另外补充,一般应该这样嵌
    try
      try
        ...
      finally
        ...
      end;
    except
      ...
    end;finaly不处理异常,except处理异常,在except后,异常已被处理,就没有异常了,所以你的语句跟下面的没有区别
    i:=1;j:=0;
    try
      i:=i div j;
    except
      showmessage(vartostr(i));
      showmessage('is this ok?');
      showmessage('except');
    end;
    showmessage('finally');
      

  9.   

    刚刚想了一下,还是firetoucher(风焱)说得有理。
    是编译器做了优化。
      

  10.   

    try...Except这样子的异常是发生在嵌套语句内部发生错误的时候,才会执行except后的语句
    而Finally这样的嵌套是无论如何都要执行的。当然会发生有时候except后的语句不执行的情况了。
      

  11.   

    把这个放到finally外面就没有上面的提示了
    i:=j;
    showmessage(vartostr(i));
      

  12.   

    呵呵,看来我是苯了点,现在才明白firetoucher(风焱)的意思,呵呵,让大家见笑了。