【ソフトウェア開発】returnが先か、finallyが先か?


趣味でも仕事でもプログラム作成をやっていますが、ちょっとした疑問が出てきました。

それは、tryの中でreturnした場合、finallyは呼び出されるのか?

手続き型でのプログラミングが長かったので、私としてはreturnしたら即座にメソッドを抜けるものだと思ってました。

そうです。try(またはcatch)の中でreturnしてもfinallyは呼び出されるのです!

試しに、C#で以下のようなコードを書いてみました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("try"); // 最初に出力される
return;
}
catch
{
Console.WriteLine("catch"); // 出力されない
}
finally
{
Console.WriteLine("finally"); // tryの次に出力される
}
Console.WriteLine("general"); // 既にreturnしているため、出力されない
}
}
}

このコードをビルドして実行してみると、

try
finally

と表示されます。

手続き型での考え方で言えば、前述の通りでreturnしているわけですから、

try

と返ってくることが期待されますが、違います。
tryでもcatchでもreturnした際にはメソッドを抜ける前に必ずfinallyが呼び出されるのです!

これはC#だけではなく、javaなどのtry-catch-finallyが使える言語なら当然のことのようです。
正直、今知れてよかったと思っています。

手続き型ではreturn前に終了処理を必ず書くかgotoなどでメソッド末尾の終了処理に飛ぶ作りにする必要がありますが、これなら終了処理をfinallyに集約することができます。
集約することができるということは、コードを書く量が減りますし、メンテナンスも1か所の修正だけで済みます。

これでコードの流れに集中してコーディングができますね♪

まだまだ学ぶことはたくさんあるなぁと思った一日でした。


Mask_Siva

北の試される大地に生息しているSEです。
楽しみながらプログラムを作ったり、ゲームで遊んだりしています。

コメントをお待ちしております

HTMLタグは利用できません


新品/中古ゲーム販売 通販ショップの駿河屋

本鯖運営維持のため、上記リンクから注文してもらえると助かります~

仮面被り過ぎ@コンプレックス大佐
@Mask_Siva

  • 今日は食あたりでダウン 医師と話したところ、昨日食べたお刺身が怪しそう 皆さんも生物の食事にはご注意ください
    about 2日 ago
  • 仙 人╔╗  天使╠╣  妖精╠╣  聖者╠╣  賢者╠╣  健全╠╣ ══════ スケベ╠╣⇦Mask_Siva  変態╠╣ ド変態╠╣   獣╠╣  性獣╠╣ 変態王╚╝ #スケベ度ランク https://t.co/NwzHF2421k 彼らには勝てないか。。。
    about 2日 ago
  • 今日学んだことは、ヤフオクAPIはGET/POST共に対応だけど、ヤフーショッピングAPIはGETのみ。 しかも、同じ意味なんだけど、パラメータ名がバラバラだったり、リストの考え方も違っているので、こういった類似APIでは統一性が求められるなと感じましたね。
    about 2日 ago

BGMにどうぞ

機動戦士ガンダムUC オリジナルサウンドトラック

2 UNICORN -澤野弘之

↓の再生ボタンで再生できます
もっと楽曲を試聴したいなら
>>>こちら<<<
2017年7月
« 6月  
 1
2345678
9101112131415
16171819202122
23242526272829
3031 

アーカイブ

↓応援おねがいします!↓

ブログランキング・にほんブログ村へ