【Python】例外処理のfinallyって意味あるん??

python-finally-necessity

久々にラーメン食べました、mizky(@mizky_Pacple)です。

Pythonの例外処理であるfinallyって書かなくても問題ないのでは?
と思って自分なりに調べてみました。

try, exceptの処理

x = 0
try:
    print('10を' + str(x) + 'で割ります。')
    print('結果は' + str(10/x) + 'です。')
except:
    print('Errorです。')
else:
    print('計算終了だ!!')

このコードの結果は、以下のようになります。

10を0で割ります。
Errorです。
計算終了だ!!

x = 2の場合(エラーが発生しない場合)は、以下の結果となります。

10を2で割ります。
結果は5.0です。
計算終了だ!!

最後の

print('計算終了だ!!')

はエラーの発生に関わらず実行されるようです。

try, except, elseの処理

少しelseの処理についても触れておきます。

以下のように、else処理を加えてみます。

x = 0
try:
    print('10を' + str(x) + 'で割ります。')
    print('結果は' + str(10/x) + 'です。')
except:
    print('Errorです。')
else:
    print('計算終了だ!!')

実行結果は以下の通りです。

10を0で割ります。
Errorです。

x = 2の場合(エラーが発生しない場合)は、以下の結果となります。

10を2で割ります。
結果は5.0です。
計算終了だ!!

エラーが発生しなかった場合は、else文が実行されるようです。

try, except, else, finallyの処理

さらに、以下のようにfinally処理を加えてみます。

x = 0
try:
    print('10を' + str(x) + 'で割ります。')
    print('結果は' + str(10/x) + 'です。')
except:
    print('Errorです。')
else:
    print('計算終了だ!!')
finally:
    print('計算終了つってんだろ!!!!')

結果は以下の通りです。

10を0で割ります。
Errorです。
計算終了つってんだろ!!!!

x = 2の場合(エラーが発生しない場合)は、以下の結果となります。

10を2で割ります。
結果は5.0です。
計算終了だ!!
計算終了つってんだろ!!!!

エラーの発生によらず、finally文は実行されるようです。

finallyの必要性はあるのか?

上記のコードでfinally書かない場合はどうなるのでしょうか。

x = 0
try:
    print('10を' + str(x) + 'で割ります。')
    print('結果は' + str(10/x) + 'です。')
except:
    print('Errorです。')
else:
    print('計算終了だ!!')
print('計算終了つってんだろ!!!!')

省略してみました。結果は以下の通りです。

10を0で割ります。
Errorです。
計算終了つってんだろ!!!!

x = 2の場合(エラーが発生しない場合)は、以下の結果となります。

10を2で割ります。
結果は5.0です。
計算終了だ!!
計算終了つってんだろ!!!!

・・・finallyなくても変わらないじゃん。。。

結論:finallyはなくてもよい。

Finallyは書いても書かなくても処理自体は変わらないようです。

ただし、読み手にとってはfinallyがあったほうが、
エラーの有無に関係なく実行されることが分かるため、
あったほうが親切かとは思います(適当)。

コメント

タイトルとURLをコピーしました