【Python】例外処理の書き方。else, finally【入門第41回】

146, 2019-09-02

目次

例外処理の書き方(続き)

こんにちは、narupoです。

今回は前回に引き続き、例外処理についてやっていきます。
前回はraise, try, exceptなどの書き方を見てきました。
今回は↓のような内容です。

  • elseの書き方

  • finallyの書き方

  • 独自例外の作り方

  • すべての例外を握りつぶす方法

なかなか過激な項目もありますが、やっていきたいと思います。

elseの書き方

try文で例外を捕まえるときに、例外が送出されなかった場合の処理を書きたい場合は、elseを使います。
elseは↓のようにtry文にくっつけて書きます。

:::text
try:
    例外が送出されそうな処理
except 例外クラス:
    例外を捕まえたときの処理
else:
    例外が送出されなかったときの処理

たとえば↓のようなコードを見てみましょう。

:::python
try:
    pass
except Exception:
    print('例外が送出されました')
else:
    print('今日も平和です')

↑のコードの実行結果は↓のようになります。

今日も平和です

try文の中で例外が送出されていないので、expcetのところは実行されません。
その代わりにelseのところが実行され「今日も平和です」というメッセージが出力されます。

たとえば↓のようにtry文の中で例外を送出させると、

:::python
try:
    raise Exception('戸締りを忘れました')
except Exception:
    print('例外が送出されました')
else:
    print('今日も平和です')

実行結果は↓のようになります。

例外が送出されました

exceptにジャンプして、elseは実行されません。

このようにtry文にelseをつけると、例外が送出されなかったときの処理を書くことができます。
↓のように書くのと何が違うのかという話ですが、

:::python
try:
    pass
except Exception:
    print('例外が送出されました')

print('今日も平和です')

↑の場合は例外が送出されてもされなくても、最後のprint('今日も平和です')が実行されます。
「例外が送出されなかったときの処理」を書きたい場合はelseを使いましょう。

finallyの書き方

try文で、try文が終了したときに処理を書きたい場合finallyを使います。
finallyは↓のように書きます。

:::text
try:
    例外が送出されそうな処理
except 例外クラス:
    例外を捕まえたときの処理
finally:
    try文が終了したときの処理

たとえば↓のようなコードを見てみましょう。

:::python
try:
    print('try文を実行中')
except Exception:
    print('例外が送出されました')
finally:
    print('おわりです')

↑のコードの実行結果は↓のようになります。

try文を実行中
おわりです

↑のようにfinallytry文が終了するときに実行されます。
もちろん例外が送出されても同じです。
たとえば↓のようなコード。

:::python
try:
    raise Exception('ガスの元栓閉めたかしら')
except Exception:
    print('例外が送出されました')
finally:
    print('おわりです')

↑のコードの実行結果は↓のようになります。

例外が送出されました
おわりです

↑のように、finally例外が送出されても実行されます
ここがelseとの大きな違いです。

独自例外の作り方

例外を自作したい場合があります。
そういったときはExceptionクラスを継承して、独自例外を作ります。
たとえばCrushという独自例外を作りたい場合は、↓のようにします。

:::python
class Crush(Exception):
    pass

この例外は他の例外クラスと同じように使うことができます。
raiseで送出したり、

:::python
raise Crush('クラッシュ!')

try文で捕まえたり。

:::python
try:
    raise Crush('クラッシュ!')
except Crush as e:
    print(e)

だいたい、プロジェクトではこのような独自例外をいくつか作る羽目になります。
ほとんどの場合、組み込みの例外でこと足りる場合が多いですが、プロジェクトに珍しい機能などがある場合は、その機能に合わせて例外クラスを作ることになるかもしれません。

すべての例外を握りつぶす方法

すべての例外を握りつぶして、例外の送出を無かったことにしたい場合もあります。
そういう時は↓のようにします。

:::python
try:
    raise Exception('例外発生!')
except:
    print('例外を握りつぶしました')

exceptに例外クラスを指定しないと、すべての例外を補足するようになります。
↑のコードの実行結果は↓のようになります。

例外を握りつぶしました

このようにexceptであらゆる例外を捕まえて無かったことにすることを、俗に「例外を握りつぶす」などと言います。
ここで注意したいのは、例外を握りつぶす行為はあまり褒められたことではないということです。
なぜなら、例外というのはエラーが発生した時に送出されます。
例外を握りつぶすということは、そのエラーを握りつぶすということです。
エラーを握りつぶすと、そのエラーは誰にも補足することが出来ません。
よって、プログラムを実行して何かエラーが発生しても、どうすることもできなくなります。

以上の理由によって、例外を握りつぶするのはあまりおススメできることではありません。
例外としては、デバッグなどには活用できるという点です。

おわりに

以上で例外についての解説は終わりです。
例外は、最初はうまく扱えないものです。
しかし、慣れてくると良い感じに扱えるようになるので、最初は下手なりに使ってみましょう。

以上、次回に続きます。

また見てね

関連動画