Select Language

AI Technology Community

6.4、Python try finally文の使い方

前で except ブランチと else ブランチについて説明しました。これらはそれぞれ例外が発生したときと例外が発生しなかったときに実行されます。次に、どんな場合でも実行され、しかも最後に実行される別のブランチを説明します。これが finally ブランチです。

以下は finally ブランチの例です。

>>> def finally_demo(a, b):            # 例外処理を含む関数を定義
...     try:
...             a = a / b
...     except ZeroDivisionError, except_obj:   # 0 で割る例外を捕捉
...             print("Exception Message = %s" % except_obj.message)
...     else:                          # 例外が発生しなかったときに実行されるブランチ
...             print("No Exception is Got")
...     finally:                       # 例外の有無に関わらず実行されるブランチ
...             print("Finally Branch is Running")
...
>>> finally_demo(12, 2)
No Exception is Got                    # 9 行目の出力、finally ブランチの出力
Finally Branch is Running
>>> finally_demo(12, 0)               
Exception Message = integer division or modulo by zero  # 5 行目の出力
Finally Branch is Running             # 9 行目の出力


例外が発生しても捕捉されなかった場合でも、このブランチは実行されます。以下の例のように:

>>> def finally_demo(a, b):            # 関数を定義
...     try:                           # 例外捕捉エリア
...             a = a / b                              
...     except EOFError, except_obj:   # ファイルが終了した場合の例外
...             print("Exception Message = %s" % except_obj.message)
...     else:                          # この例外が発生しなかった場合
...             print("No Exception is Got")
...     finally:                       # 例外の有無に関わらず実行されるブランチ
...             print("Finally Branch is Running")
...                                    # 関数定義終了
>>> finally_demo(12, 4)                # 例外が発生しなかった
No Exception is Got                    # else ブランチが実行される
Finally Branch is Running             # finally ブランチが実行される
>>> finally_demo(12, 0)                # 例外が発生したが捕捉されなかった
Finally Branch is Running             # finally ブランチは依然として実行される
Traceback (most recent call last):     # 例外情報
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in finally_demo  # 捕捉されなかった例外
ZeroDivisionError: integer division or modulo by zero

また、正常なブランチに return 文が含まれ、例外が発生しなかった場合でも、finally ブランチは実行されます。これは else ブランチとは異なります。以下はその例です。

>>> def div(a, b):                  # 除算関数を定義
...     try:                        # 正常ブランチ
...         c = a / b          
...         return c
...     except ZeroDivisionError as ex_obj:
...         print("Got Exception: %s" % ex_obj)
...     finally:
...         print(u"finallyブランチが実行中")
...                      # 関数定義終了
>>> div(8, 2)
finallyブランチが実行中        # finally ブランチの出力
4                        # 結果、つまり戻り値


post
  • 7

    item of content
例外処理は現代のプログラミング言語の基本的な特性でもあり、正常な分岐と例外の分岐を切り分けることができます。C言語とは異なり、正常な分岐と例外の分岐が混在することはありません。
Pythonにおいて例外は特別なオブジェクトであり、この例外オブジェクトを通じて例外発生時の情報を例外処理関数に渡すことができます。
この章では、例外の捕捉方法、例外情報の取得方法、特定の例外の無視、例外のスロー方法、カスタム例外オブジェクトの作成、そしてPython 2とPython 3における例外処理の類似点と相違点について説明します。最後に、一般的なシステム定義の例外についても紹介します。