Pythonのtry文のexcept elseで例外が発生しなかった時の処理を書く

try文except節の中でelse節は、例外が発生しなかった場合の処理を書く時に使います。フローや使い方はとてもシンプルなので、早速見ていきましょう。

try文とexceptの基本
基本的な try except 文については、「Pythonのtry文とexceptによる例外処理の方法」で詳細に解説しています。そもそもの try except について復習しておきたい方はこちらからご覧ください。
目次

1. try文のelseとは

try文のelse節は、「例外が発生しなかった時の処理」を書く時に使います。フロー図にすると以下のようになります。

このように、例外が発生した時はexceptに書かれた処理文を実行し、例外が発生しなかった時はelseに書かれた処理文を実行します。つまりelse節があることによって例外が発生したのか、しなかったのかを明確にできるということです。この点はプログラミング上、大きなメリットがあります。

それでは早速コードの書き方を見てみましょう。

In [0]:
try:
    処理文
except:
    処理文
else:
    処理文

通常のtry文とexcept節の下にelse節を追加するだけですね。

実際のコードを見てみましょう。次のコードでは、tryブロックに書いた処理に例外が発生していないので、exceptブロックの処理は実行されずに、elseブロックの処理が実行されています。

In [1]:
try:
    num = 1+1
except TypeError:
    print('TypeErrorです。')
else:
    print(num)
    print('例外は発生しませんでした。')
2
例外は発生しませんでした。

これが、もし例外が発生していたら、次のようにexceptブロックの処理は実行され、elseブロックの処理は実行されません。

In [2]:
try:
    num = '1'+1
except TypeError:
    print('TypeErrorです。')
else:
    print(num)
    print('例外は発生しませんでした。')
TypeErrorです。

これがtry文におけるelse節です。

もう一つコード例を見てみましょう。

以下は、sum = 10000 に対して、入力した人数で割り算を行い、一人当たりの金額を計算するプログラムです。for文で、数値は3回入力できるようになっています。for文については「Pythonのfor文による繰り返し処理(forループ)の基本」で確認しておきましょう。

In [3]:
sum = 10000

for i in range(3):
    num = input('数値を入力してください。')
    try:
        value = round(sum/int(num))
        print(f'一人当たり{value}円です。')
    except ZeroDivisionError:
        print('0以外の数字を入力してください。\n')
    except ValueError:
        print('値の型が異なります。\n')
    else:
        discount = round(value*0.9)
        print(f'割引券をお持ちなので1割引の{discount}円になります。\n')
数値を入力してください。4
一人当たり2500円です。
割引券をお持ちなので1割引の2250円になります。

数値を入力してください。0
0以外の数字を入力してください。

数値を入力してください。五
値の型が異なります。

例外が発生しなかった時のみelseブロックの処理文が実行されていますね。このコードのtry文だけを抜き出して、処理経路を図にしたものが以下です。

例外が発生した時と、しなかった時の処理をしっかり見比べてみてくださいね。

2. try文のelseとfinallyの組み合わせ

それでは、次にelseとfinallyを組み合わせたコードを見てみましょう。その場合、以下のような処理経路になります。なおfinally節については「Pythonのtry except finallyで例外発生の有無を問わず行う処理を書く」で解説しています。

このように、elseとfinallyを同時に書くと、例外が発生した場合はexceptブロックとfinallyブロックの処理が実行されます。一方で、例外が発生しなかった場合はelseブロックとfinallyブロックの処理が実行されます。

実際のコードを見てみましょう。次の例は、先ほどのコードに、finallyブロックを追加したものです。

In [4]:
sum = 10000

for i in range(3):
    num = input('数値を入力してください。')
    try:
        value = round(sum/int(num))
        print(f'一人当たり{value}円です。')
    except ZeroDivisionError:
        print('0以外の数値を入力してください。')
    except ValueError:
        print('値の型が異なります。')
    else:
        discount = round(value*0.9)
        print(f'割引券をお持ちなので1割引の{discount}円になります。')
    finally:
        print('計算を終了します。\n')
数値を入力してください。4
一人当たり2500円です。
割引券をお持ちなので1割引の2250円になります。
計算を終了します。

数値を入力してください。0
0以外の数値を入力してください。
計算を終了します。

数値を入力してください。五
値の型が異なります。
計算を終了します。

elseブロックの処理は例外が発生しなかった場合のみ実行されているのに対して、finallyブロックの処理は、例外が発生したしないに関わらず実行されていますね。

このコードのtry文のブロックのみ抜き出して処理経路を表したものが下図です。

3. まとめ

ここまで見てきたように、try文のelse節は、とてもシンプルで、「例外が発生しなかった場合のみ実行される処理を指定する」時に使います。これがあることによって、try文の中で例外が発生したのかしなかったのかを明確にすることができます。この点は大きなメリットがあります。

また、finallyと組み合わせた時の処理経路もしっかりと把握しておきましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる