欢迎讨论try...except...finally嵌套问题。

lw549 2003-07-11 04:15:24
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的情况,大家可以试一下。
...全文
501 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lw549 2003-07-11
  • 打赏
  • 举报
回复
呵呵,看来我是苯了点,现在才明白firetoucher(风焱)的意思,呵呵,让大家见笑了。
lw549 2003-07-11
  • 打赏
  • 举报
回复
把这个放到finally外面就没有上面的提示了
i:=j;
showmessage(vartostr(i));
Linux2001 2003-07-11
  • 打赏
  • 举报
回复
try...Except这样子的异常是发生在嵌套语句内部发生错误的时候,才会执行except后的语句
而Finally这样的嵌套是无论如何都要执行的。当然会发生有时候except后的语句不执行的情况了。
OO_is_just_P 2003-07-11
  • 打赏
  • 举报
回复
刚刚想了一下,还是firetoucher(风焱)说得有理。
是编译器做了优化。
ronaldli 2003-07-11
  • 打赏
  • 举报
回复
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');
lw549 2003-07-11
  • 打赏
  • 举报
回复
把j:=1;i:=2;
放到finally的语句块外面也照样提示
value assigned to 'i' never used,value assigned to 'j' never used
我很迷惑,呵呵。
tjff2000(fengyun),你说呢?
  • 打赏
  • 举报
回复
对,是delphi的优化器的作用。同意firetoucher(风焱)的。两个星,羡慕!!
tjff2000 2003-07-11
  • 打赏
  • 举报
回复
同意firetoucher(风焱)的。
tjff2000 2003-07-11
  • 打赏
  • 举报
回复
theone_jxm()说的不对,你就是取消debugger options下的integrated debugging选项取消,还是只显示finally,请注意程序运行时,提示value assigned to 'i' never used,value assigned to 'j' never used,我们可以猜测i:=i div j;根本没有执行。
lw549 2003-07-11
  • 打赏
  • 举报
回复
我问这个问题的目的在于如何让自己写的代码即执行except又执行finally
编译器优化论也好,delphi已经处理论也好,都不能知道自己写的语句是否执行except部分是吗?
必须自己调试才能得到结果,是吗?
OO_is_just_P 2003-07-11
  • 打赏
  • 举报
回复
同意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;
dujian_xian 2003-07-11
  • 打赏
  • 举报
回复
你的星好多啊,什么时候变成红色的?
firetoucher 2003-07-11
  • 打赏
  • 举报
回复
这应该是delphi的优化器的作用,如果你没有引用i,即i只出现在等号的左边,而没有出现在右边或者最为其他的引用参数,他会忽略跳过。你在最后加一个j:=i;试试就知道了
OO_is_just_P 2003-07-11
  • 打赏
  • 举报
回复
gz
  • 打赏
  • 举报
回复
那是个很特殊的异常,delphi已经为你的异常作处理了,所以酒会出现finally了
这样来测设

try
try
raise exception.Create('yichang ');
except
showmessage(vartostr(i));
showmessage('is this ok?');
showmessage('except');

end;
finally
showmessage('finally');

5,386

社区成员

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

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