【ソフトウェア開発】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タグは利用できません

    Advertising



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

    Twitter

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

    • 重いバグ1つ片付けた。 もう1つ重いのがあるから、それ直したら大学の方やろう。 さすがにここまで稼働するのはしんどいっす、、、
      about 2時間 ago
    • 某ゲームに出てくる観葉植物そっくりなチャーリー君と呼んでいる相棒(観葉植物)が釧路の作業部屋にいます。 なるほどくんや真宵ちゃん以上に水の管理を徹底しているおかげか新芽が出てきました!🌱
      about 3時間 ago
    • 今見たら票入ってたwwwwww いいのかな? >@cy_lind https://t.co/IorrjyOow3
      about 7時間 ago

    BGM

    もののけ姫 サウンドトラック
    33 アシタカせっ記 エンディング -久石 譲

    ↓の再生ボタンで再生できます
    色々な楽曲を試聴したいなら
    >>>こちら<<<

    Nico Nico Community

    Calendar

    2021年10月
     12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31 

    Archive

    My WIsh List

    Amazonで気になっている物をまとめています。

    「これは良かった!」「こっちの方がいいよ!」というものがあれば、教えてください<(_ _)>

    https://amzn.to/3oof0rZ