Pythonの例外をサクサク理解しよう特集:Visual Studioで始めるPythonプログラミング(2/4 ページ)

» 2017年01月13日 05時00分 公開
[かわさきしんじInsider.NET編集部]

try文

 Pythonでの例外処理にはtry文を使用する。以下では、まずはその基本型を見た後に、except節での細かな指定の方法などを見ていく。

try文の基本型

 基本となる構文を以下に示す。最もシンプルなのは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


存在していないクラス名を入力するとNameError例外が発生する

 そして、上で見た基本構文を使って、これを処理するコードは次のようになる。関数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


例外が発生しなくてもfinally節は実行される

 ArithmeticErrorクラスは実際に存在するクラス(最初に見たZeroDivisionErrorクラスの基底クラス)であり、この場合は例外は発生せずにその派生クラスが表示されている。そして、実行結果を見れば分かる通り、例外が発生しなくともfinally節が実行される。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。