try-finally,return的執(zhí)行順序小析~
項(xiàng)目中一個(gè)try-finally語(yǔ)句中有return,不明白執(zhí)行的順序,于是搜索了一番。
http://www.usdprofits.com/finally-return-t344073.htm
雖然回答的是JAVA的,但也有借鑒作用。
===================================================
首先執(zhí)行finally,然后才執(zhí)行return;
如果finally里面有return,try中的return不會(huì)再執(zhí)行;
如果try中有了異常,return也不執(zhí)行;
ps:異常實(shí)際上也是一種返回值
===================================================
http://fanyaojun.bokee.com/126611.html
有一段程序顯示先執(zhí)行try,再finally最后return。
http://www.blog.edu.cn/user1/16293/archives/2006/1248335.shtml
分析了IL代碼,指出了比較根本性的原因。
但我寫了一個(gè)程序卻出現(xiàn)了一個(gè)怪問(wèn)題。
主程序清單如下:






























它顯示的是什么呢?
按照前面講的,先寫“finally block executed.”再輸出3
可實(shí)驗(yàn)結(jié)果卻是
finally block executed.
2
怎么回事?我也來(lái)分析下IL代碼~~以下是TestFR()的~








































這里涉及到3個(gè)存儲(chǔ)區(qū):堆棧,局部變量區(qū),計(jì)算堆棧。至于它們的區(qū)別,我不是很清楚,有人知道的話,告訴我吧。
01句(以下同樣只簡(jiǎn)稱后兩位IL_0001)將數(shù)字1放到堆棧,02句彈出到局部變量0中,對(duì)應(yīng)的語(yǔ)句就是i = 1;try中幾句是將數(shù)字2放到堆棧,再?gòu)棾龅骄植孔兞?,06句將局部變量0加載到計(jì)算堆棧。07句將其彈出到局部變量1,因?yàn)橹挥杏?jì)算堆棧里有數(shù)據(jù),所以彈的是計(jì)算堆棧的值。08跳到1a去,但不能跳過(guò)finally句。
finally句中將數(shù)字3放到局部變量0中,再顯示字符串。
而后,關(guān)鍵的地方就到了。1b句將局部變量1加載到計(jì)算堆棧,再由ret返回值。
這里,為什么將局部變量1也就是數(shù)字2返回呢?不可理解呀~
posted on 2006-09-13 19:06 李威 閱讀(3952) 評(píng)論(1) 編輯 收藏