Pythonでの例外処理にはtry文を使用する。以下では、まずはその基本型を見た後に、except節での細かな指定の方法などを見ていく。
基本となる構文を以下に示す。最もシンプルなのはtry節とexcept節でだけ構成されるが、ここではfinally節も含めて紹介しよう。
try:
# 例外を発生する可能性があるコード
except:
# 例外発生時に実行するコード
finally:
# 例外の有無に関わらず最後に実行されるコード
try節には例外を発生する可能性があるコードを記述する。そこで例外が発生した場合にはexcept節がこれをキャッチするので、そこで例外を処理する。finally節は例外の有無に関係なく、try文の終了時に実行される。このことから、finally節では必ず行わなければならない後処理を書くことが多い。
ところで、先ほどの関数getsubclsはパラメーターにクラスオブジェクトを受け取ることを前提としている。そこで未定義のクラス「SomeException」をこの関数に渡してみよう。
>>> getsubcls(SomeException)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'SomeException' is not defined
そして、上で見た基本構文を使って、これを処理するコードは次のようになる。関数getsubclsには「BaseException」ではなく「SomeException」を渡している点に注意。
try:
getsubcls(SomeException)
except:
print('specify defined class name')
finally:
print('finally clause')
これを[Interactive]ウィンドウで実行した結果を以下に示す。
>>> try:
... getsubcls(SomeException)
... except:
... print('specify defined class name')
... finally:
... print('finally clause')
...
specify defined class name
finally clause
例外が発生したため、except節でこれがキャッチされてメッセージが表示され、その後にfinally節で「finally clause」というメッセージが表示されている。余談だが、この例外は関数getsubcls内部で発生したものではなく、関数呼び出しの時点で「SomeException」という名前がなかったことから発生している。
そして、「SomeException」ではなく、既存の例外クラスである「ArithmeticError」を渡した場合の実行結果は次のようになる。
>>> try:
... getsubcls(ArithmeticError)
... except:
... print('specify defined class name')
... finally:
... print('finally clause')
...
ArithmeticError
FloatingPointError
OverflowError
ZeroDivisionError
finally clause
ArithmeticErrorクラスは実際に存在するクラス(最初に見たZeroDivisionErrorクラスの基底クラス)であり、この場合は例外は発生せずにその派生クラスが表示されている。そして、実行結果を見れば分かる通り、例外が発生しなくともfinally節が実行される。
Copyright© Digital Advantage Corp. All Rights Reserved.