やり直しPython3(try, except)

2016-04-30(Sat) by Makoto Yamahira

Python3の勉強(8) try, except

Python基礎勉強8日目です。今回は「try except」について。
決まった処理を何度も実行する場合にコードを再利用できると便利だ。
そのような時に関数が使える。

例外処理

エラーが起きる可能性がある処理を実装する場合にはtry, exceptで例外処理を書くと良い。
tryブロックでキャッチした例外をexceptブロックで処理できる。

    >>> a = 10
    >>> b = 0
    >>> try:
    ...     c = a / b
    ...     print(c)
    ... except:
    ...     print('例外発生')
    ... 
    例外発生

exceptキーワードに続けて例外のタイプを書くとを例外のタイプ別に処理を書くことができる。
Exceptionで全ての例外を処理できる。

    >>> a = 10 
    >>> b = 0
    >>> try:
    ...     c = a / b
    ...     print(c)
    ... except ZeroDivisionError:
    ...     print('0で割り算はできないよ。')
    ... except Exception:   # Exceptionは省略しても正常に動く
    ...     print('原因不明の例外発生')
    ... 
    0で割り算はできないよ。

例外のタイプに続けて「as 変数名」を書くと発生した例外オブジェクトを利用することができる。

    >>> a = 10
    >>> b = 0
    >>> try:
    ...     c = a / b
    ...     print(c)
    ... except ZeroDivisionError as err:
    ...     print('例外の内容:', err)
    ...     print('...要するに、0で割り算はできないよぅ')
    ... except Exception as err:
    ...     print('例外の内容:', err)
    ... 
    例外の内容: division by zero
    ...要するに、0で割り算はできないよぅ

exceptブロックで例外をキャッチできない場合は実行時エラーとなりプログラムが止まる。

    >>> a = 10
    >>> b = 0
    >>> try:
    ...     c = a / b
    ...     print(c)
    ... except IndexError:
    ...     print('インデックスの範囲を超えました。(今回はこの例外は発生しないけどね)')
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    ZeroDivisionError: division by zero

その場合、上の階層のtry, exceptで例外をキャッチすることでプログラムの強制終了を防ぐことができる。

    >>> try:
    ...     a = 10
    ...     b = 0
    ...     try:
    ...         c = a / b
    ...         print(c)
    ...     except IndexError:
    ...         print('インデックスの範囲を超えました。(今回はこの例外は発生しないけどね)')
    ... except Exception as err:
    ...     print('例外発生:', err)
    ... 
    例外発生: division by zero

自分専用の例外

PythonにはZeroDivisionErr、IndexErrといった例外がたくさん用意されている。
しかし場合よっては自分専用の例外を作る必要もあるだろう。
Exceptionクラスを継承したクラスを作ればPythonの例外型と同じようにtry, exceptで使うことができる。
raiseキーワードで例外を発生することができる。

    >>> class MakohiraLikeItException(Exception):
    ...     pass
    ... 
    >>> try:
    ...     while True:
    ...         hate_color = input('嫌いな色は?')
    ...         if hate_color == 'blue':
    ...             raise MakohiraLikeItException(hate_color)
    ...         else:
    ...             print('嫌いな色:', hate_color)
    ... except MakohiraLikeItException:
    ...     print('makohiraはその色が好きです。')
    ... 
    嫌いな色は?red
    嫌いな色: red
    嫌いな色は?blue
    makohiraはその色が好きです。

勉強に使っている本はオライリーの「入門Python3」


Comments