C# try block 中的 return 是直接跳回上一層程式嗎?

閱讀時間約 4 分鐘

程式寫久了對執行流程會總有些自以為是的邏輯,而這些自己為是的可能讓你產生難以找尋的Bug.比如說在任何地方return就是直接回到原呼叫端的流程,但是這個return在try block中可能不是想像中的那樣。

以下範例讓我們看看return之後程式跑到那去?

// returnInTryBlock : 是否在try block 中 return
void TestReturnInTryBlock(bool returnInTryBlock)
{
Console.WriteLine ("開始TestReturnInTryBlock");

try
{
Console.WriteLine ("開始Try Block");

if (returnInTryBlock)
{
Console.WriteLine ("returnInTryBlock is true");

Console.WriteLine ("即將 return");
return;
}
else
{
Console.WriteLine ("returnInTryBlock is flase");
}

Console.WriteLine ("結束Try Block");
}
finally
{
Console.WriteLine ("開始Finally block");

// some code for clean up

Console.WriteLine ("結束Finally block");
}

Console.WriteLine ("結束TestReturnInTryBlock");
}

測試一下try block中沒有執行到return的流程,如預期的在沒有exception的情況下,完整的執行完try block後接著執行finally block,執行完finally block後再執行try statements之後的流程,也就是Console.WriteLine ("結束TestReturnInTryBlock"); 最後就離開了TestReturnInTryBlock程序回到了上一層的叫用程序。

Console.WriteLine ("程式開始");

TestReturnInTryBlock (false);

Console.WriteLine ("程式結束");


//=== 執行結果
程式開始
開始TestReturnInTryBlock
開始Try Block
returnInTryBlock is flase
結束Try Block
開始Finally block
結束Finally block
結束TestReturnInTryBlock
程式結束

再來測試try block中有執行到return的流程,原本預期的在沒有exception的情況下,完整的執行到return時會離開了TestReturnInTryBlock程序回到了上一層的叫用程序,但執行結果並非如此,而是執行到return後依然會跳躍到finally block , 完整執行完finally block 後才會直正的return回上一層的程序。

Console.WriteLine ("程式開始");

TestReturnInTryBlock (true);

Console.WriteLine ("程式結束");

//=== 執行結果
程式開始
開始TestReturnInTryBlock
開始Try Block
returnInTryBlock is true
即將 return
開始Finally block
結束Finally block
程式結束


所以我以前在使用try catch finally這一組的 statements常常畫蛇添足,為了要釋放之前叫用如資料庫連線的一些資源,會額外在try block 中有return情況前多叫用了和 finally block中相同的程式一次,現在知道了,以後就只要安心的在try block中return就好了,程式流程一定會走到finally block完成後return回上一層的程序。

3會員
3內容數
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
以下會舉一個簡單的生活例子 (Inherit 繼承) 以顯示出Inheritance 的基本用法, 以下供各位參考: 相關頁面: C#繼承 – Inheritance 繼承 的基本用法 – 加入 for loop, if, Array, Collection的例子
Thumbnail
C# List – (C#教學) – 所謂List, 就是把多個同類的variable串列在一起. 加上for, foreach迴圈的使用, 令他們可以作出相同的行為. 相關頁面: C# 陣列 – 學會Array陣列基本5種應用方法 – 初始化, 加入值, 更新值, 刪除值, foreach迴圈
Thumbnail
C# 迴圈 (C# 教學) – while就是在條件句作立, 即true的情況下, 繼續執行while的block內的邏輯, 直至條件句的結果為false. 其重點在條件句的成立與while 內 BLOCK的重用. 本篇暫時只以基礎的介紹, 以下為一些例子顯示出while的用法. 其他相關:
Thumbnail
C# 迴圈(C# 教學) – for loop 可以說是程序編寫的基本功. 運用LOOPING可以減少程式碼, 只需透過for內的BLOCK, 就可把程式碼重用, 避免要不停把程序碼重覆. 以下我會介紹迴圈的結構, 運行方式, 如何離開迴圈, 以及迴圈的種類. 2) 迴圈的種類 3) 迴圈的用法
Thumbnail
auto(自動)、register(暫存器)、static(靜態)、extern(外部),以作用範圍(scope)、存儲時期(life time)、連結(linkage)的不同作為區別。
Thumbnail
2004年聖彼得堡一家電影院的影廳裡頭擠滿了等著《The Lord of the Rings: The Two Towers 魔戒二部曲:雙城奇謀》放映的俄羅斯觀眾。這個場次的不尋常之處除了票價是平常電影票的好幾倍之外,銀幕上的電影似乎不盡然是我們看過《魔戒二部曲:雙城奇謀》......
我離開的時候,其實流浪了一陣子,才到這間 我們並沒有說好一起走,和一起去 T哥是最早去的 是後來學長找我去B教會的特會,我感受到神對我說:「孩子,你該回家了!」那裡真的跟以前很不一樣 沒有人強迫你要做事,你自己決定 身心狀況不好,你的輔導會陪伴你並同理,直到你願意才會讓你持續參與活動。 沒有人逼我
Thumbnail
只要你肯聯繫我,我就願意再勇敢一次, 重道覆轍也沒關係, 就算你是陷阱、是無底深淵、是深不見底的大海, 只要是你,我願意跳下去, 願意沈溺於一片以你為名的深海。 我站在風口,整個世界都是你的氣息。 我將滿懷愛意的等待下個盛夏的風, 和遠方的你。 你知道 C-14 的半衰期有多久嗎? 它不及我在冥冥之
Thumbnail
可能包含敏感內容
如果你有關注台灣媒體,就會知道安心亞是全台首位公開穿C字褲的女藝人,那時才2009年,跟現在相比之下算是民風更為保守的年代,一方面真的很佩服她的勇氣,另一方面又會覺得:穿C字褲有什麼好處呢?其實C字褲並不是大眾印象中跟情色畫上等號的東西,反而像是丁字褲的升級版而已,都能拿來做隱藏痕跡使用。希望這篇文
Thumbnail
C世代(Connected Generation, 連接世代)是美容保養品-網購的主力──了解他們的特質,才能讓保養品網路行銷大賣... 隨著智慧裝置普及,全球「網路購物」市場高速增長(根據eMarketer統計:全球零售電子商務銷售額,2017年為1.357萬億美元,預估至2021年將達3.554
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
以下會舉一個簡單的生活例子 (Inherit 繼承) 以顯示出Inheritance 的基本用法, 以下供各位參考: 相關頁面: C#繼承 – Inheritance 繼承 的基本用法 – 加入 for loop, if, Array, Collection的例子
Thumbnail
C# List – (C#教學) – 所謂List, 就是把多個同類的variable串列在一起. 加上for, foreach迴圈的使用, 令他們可以作出相同的行為. 相關頁面: C# 陣列 – 學會Array陣列基本5種應用方法 – 初始化, 加入值, 更新值, 刪除值, foreach迴圈
Thumbnail
C# 迴圈 (C# 教學) – while就是在條件句作立, 即true的情況下, 繼續執行while的block內的邏輯, 直至條件句的結果為false. 其重點在條件句的成立與while 內 BLOCK的重用. 本篇暫時只以基礎的介紹, 以下為一些例子顯示出while的用法. 其他相關:
Thumbnail
C# 迴圈(C# 教學) – for loop 可以說是程序編寫的基本功. 運用LOOPING可以減少程式碼, 只需透過for內的BLOCK, 就可把程式碼重用, 避免要不停把程序碼重覆. 以下我會介紹迴圈的結構, 運行方式, 如何離開迴圈, 以及迴圈的種類. 2) 迴圈的種類 3) 迴圈的用法
Thumbnail
auto(自動)、register(暫存器)、static(靜態)、extern(外部),以作用範圍(scope)、存儲時期(life time)、連結(linkage)的不同作為區別。
Thumbnail
2004年聖彼得堡一家電影院的影廳裡頭擠滿了等著《The Lord of the Rings: The Two Towers 魔戒二部曲:雙城奇謀》放映的俄羅斯觀眾。這個場次的不尋常之處除了票價是平常電影票的好幾倍之外,銀幕上的電影似乎不盡然是我們看過《魔戒二部曲:雙城奇謀》......
我離開的時候,其實流浪了一陣子,才到這間 我們並沒有說好一起走,和一起去 T哥是最早去的 是後來學長找我去B教會的特會,我感受到神對我說:「孩子,你該回家了!」那裡真的跟以前很不一樣 沒有人強迫你要做事,你自己決定 身心狀況不好,你的輔導會陪伴你並同理,直到你願意才會讓你持續參與活動。 沒有人逼我
Thumbnail
只要你肯聯繫我,我就願意再勇敢一次, 重道覆轍也沒關係, 就算你是陷阱、是無底深淵、是深不見底的大海, 只要是你,我願意跳下去, 願意沈溺於一片以你為名的深海。 我站在風口,整個世界都是你的氣息。 我將滿懷愛意的等待下個盛夏的風, 和遠方的你。 你知道 C-14 的半衰期有多久嗎? 它不及我在冥冥之
Thumbnail
可能包含敏感內容
如果你有關注台灣媒體,就會知道安心亞是全台首位公開穿C字褲的女藝人,那時才2009年,跟現在相比之下算是民風更為保守的年代,一方面真的很佩服她的勇氣,另一方面又會覺得:穿C字褲有什麼好處呢?其實C字褲並不是大眾印象中跟情色畫上等號的東西,反而像是丁字褲的升級版而已,都能拿來做隱藏痕跡使用。希望這篇文
Thumbnail
C世代(Connected Generation, 連接世代)是美容保養品-網購的主力──了解他們的特質,才能讓保養品網路行銷大賣... 隨著智慧裝置普及,全球「網路購物」市場高速增長(根據eMarketer統計:全球零售電子商務銷售額,2017年為1.357萬億美元,預估至2021年將達3.554