關於finally的一些認知

簡介:相信大家在開發中都能使用很好的處理異常,那麼避免不了和try catch finally 接觸,慢慢的發現了下面的幾個問題,開發環境是vs2010 +reshaper,當你想使用代碼塊時,智能提示會提示try和tryf兩種,那麼這兩種代碼塊有什麼樣的區別那,還有就是c#中的return是結束當前執行的方法,那麼如果我們在使用try catch finally時,在try代碼塊和catch代碼塊中都return;一下,那麼finally中的代碼還會執行嗎,如果執行的話,如果return 後面是調用一個方法,那麼return後面的方法中的代碼和finally中的代碼那個先執行那,下面帶着這兩個問題,我們來弄兩個小例子

1.第一個例子,來說明try ,tryf的區別

當我們鍵入try 回車時,vs會添加以下代碼,

try
            {


            }
            catch (Exception)
            {
                
                throw;
            }

上面的這種方式,主要適用於處理託管資源的異常處理,不需要在finally中關閉連接等操作

當我們鍵入tryf 回車時,vs會添加以下代碼

  try
            {


            }
            finally
            {
                
            }

那麼這種異常處理,適用於哪種情況那,按說出現了finally應該是用來釋放佔用資源的處理吧,可這種方式,真的能釋放資源嗎,答案是否定的


我認爲智能提示的作用是用來提高開發人員的額開發效率的,但是如果提示的代碼塊可能包含某些可能存在的錯誤的話,這種智能提示還是不要有的好,因此,我們也可以總結出,在c#的開發中如果我們要使用異常處理,有以下兩種參考方式,

try
            {


            }
            catch (Exception)
            {
                
                throw;
            }

或者

try
            {


            }
            catch (Exception e)
            {


            }
            finally
            {


            }

前一種解決是託管資源的異常,後一種解決是非託管資源的異常,第一個?,就到這裏吧,多說一句,之所以會出現上面的疑問,大家自己可以嘗試着上面3種可能的異常處理多級嵌套試試,就知道爲什麼建議用後兩種方式了

2.第二個例子

首先我們先來解決第一個疑問,

上代碼



從上面2個圖可知,try,catch中return了,finally中的代碼執行了,第一個小疑問,解決,注意finally中是不允許出現return的,編譯都通不過,

再多想一個問題,如果代碼修改如下:


可以看出try,catch中的return對finally中的代碼的執行時沒有影響的,但是對後面的代碼時起作用的

接下來,我們解決第二個小疑問

代碼


從圖中看出現執行了return 後的testvoid方法,後自行了finally中的代碼,第二個問題解決

發佈了171 篇原創文章 · 獲贊 252 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章