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回上一層的程序。

留言
avatar-img
留言分享你的想法!
avatar-img
Pluto Liu的沙龍
3會員
3內容數
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
回頭看了一眼,腳步仍然往前進 這是一篇廣告文,也是一篇回顧,反省是否進步?還是走錯路? 每個人都有選擇,每天都在做出選擇,但沒有標準答案
Thumbnail
回頭看了一眼,腳步仍然往前進 這是一篇廣告文,也是一篇回顧,反省是否進步?還是走錯路? 每個人都有選擇,每天都在做出選擇,但沒有標準答案
Thumbnail
學習軟體開發的路上常常苦於網路資訊爆炸嗎? 教學何其多,但卻遇到無法明確選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您業界開發重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 人生的道路中總會來點意外與
Thumbnail
學習軟體開發的路上常常苦於網路資訊爆炸嗎? 教學何其多,但卻遇到無法明確選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您業界開發重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 人生的道路中總會來點意外與
Thumbnail
在第八課中,我們將探索 Python 中的錯誤處理。 當 Python 程式在運行過程中遇到錯誤時,會引發所謂的異常 (Exceptions)。 我們可以使用 try/except 語句來捕獲和處理這些異常,防止我們的程式意外終止。
Thumbnail
在第八課中,我們將探索 Python 中的錯誤處理。 當 Python 程式在運行過程中遇到錯誤時,會引發所謂的異常 (Exceptions)。 我們可以使用 try/except 語句來捕獲和處理這些異常,防止我們的程式意外終止。
Thumbnail
Hi,大家好。我是茶桁。 在我们日常使用Python或者其他编程语言的时候,不可避免的都会出现报错和异常。那么,我们今天就来谈谈异常。 什么是异常? 异常异常,根据名字简单理解,那就是非正常,也就是没有达到预期目标。
Thumbnail
Hi,大家好。我是茶桁。 在我们日常使用Python或者其他编程语言的时候,不可避免的都会出现报错和异常。那么,我们今天就来谈谈异常。 什么是异常? 异常异常,根据名字简单理解,那就是非正常,也就是没有达到预期目标。
Thumbnail
★指路何去─這是我自己選擇的路。 踏上了,說什麼也不會輕言放棄。
Thumbnail
★指路何去─這是我自己選擇的路。 踏上了,說什麼也不會輕言放棄。
Thumbnail
跳越頻道已建立,連線成功,呼 ⋯似乎是完成了,來試試看吧。🕙
Thumbnail
跳越頻道已建立,連線成功,呼 ⋯似乎是完成了,來試試看吧。🕙
Thumbnail
近幾年看到蠻多光怪陸離的開發鬼故事,也見識過各種奇醜無比的失事原因
Thumbnail
近幾年看到蠻多光怪陸離的開發鬼故事,也見識過各種奇醜無比的失事原因
Thumbnail
其實每次的糾結都有答案,只是我好像很喜歡這種糾結的過程和試探,老靈魂在拉扯,看破的卻不說破的,寧可磕到了才願意放手的那種要叫做魯莽嗎的勇氣。不願意後悔,可能是最後的原動力,倒乾淨最後的殘沙,鞋子穿了走路才會舒服。大不了換一雙拖鞋。
Thumbnail
其實每次的糾結都有答案,只是我好像很喜歡這種糾結的過程和試探,老靈魂在拉扯,看破的卻不說破的,寧可磕到了才願意放手的那種要叫做魯莽嗎的勇氣。不願意後悔,可能是最後的原動力,倒乾淨最後的殘沙,鞋子穿了走路才會舒服。大不了換一雙拖鞋。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News