Python

[Python] 例外処理「try~except~else~finally」の使い方

2018年7月3日

こんにちは!土門大貴(daikidomon)です。

Pythonの例外処理で使用する「try~except~else~finally」の使い方を紹介します。

例外処理を使用することで、python実行時の各環境の状態に依存した予期せぬエラーを処理することができます。

この記事では初心者向けに「例外処理」と「エラー」の違いや、例外処理ごとに処理を分ける方法なども合わせて説明します。

例外処理が扱えると下のようなことも実装可能です。

[Python] 例外処理で指定のデータ型以外を入力させない

こんにちは!土門大貴(daikidomon)です。 ブログなどの各種メディアではデータ型の確認方法は公開されていますが、 ...

続きを見る

例外とは?エラーとは何が違うのか?

例外処理を説明する前に例外というものがあります。

例外とは、「様々なコンピュータの状態によって発生したエラー」を指します。

またエラーには構文エラーというものがあり、これは「プログラミングが正しく書かれていないエラー」を指します。

図にすると下がエラーの全体イメージです。

Pythonと構文エラーと例外

つまり例外処理とは、「様々なコンピュータの状態によって発生したエラー時の処理」を指します。

例外処理の基本:try~except

例外処理の基本的な書き方、「try~except」文の書き方を紹介します。

try」は、「例外が発生する可能性がある処理」を書きます。

finally」は、「例外発生時の処理」を書きます。
try:
<例外が発生する可能性がある処理>
except <例外①>:
<例外発生時の処理①>
except <例外②>:
<例外発生時の処理②>

上記のようにexceptを複数書いて、複数の例外処理を設定することもできます。

下がサンプルコードになります。

x = 100
y = 0

try:
result = x / y
except ZeroDivisionError:
print("ZeroDivisionError: division by zero")
exit(1)
except BufferError:
print("BufferError: buffer overflow")
exit(2)
except :
print("Error others")
exit(3)

12行目のように、例外を指定しなくてもexceptは使用出来ます。

例外処理を詳細に制御:else、finally

例外処理をさらに細かく制御するために「else」、「finally」があります。

else」は、「例外が発生しなかった時に処理する」時に利用します。

finally」は、「例外の発生有無問わず、最後に必ず処理させる」時に利用します。

try:
    <例外が発生する可能性がある処理>
except:
    <例外発生時の処理①>
else:
    <例外が発生しない時の処理>
finally:
    <例外の発生有無にかかわらず処理>

下がサンプルコードになります。

def divide(x, y):
  try:
    result = x / y
  except ZeroDivisionError:
    print("division by zero!")
  else:
    print("result is", result)
  finally:
    print("executing finally clause")

>>> divide(100, 50)
result is 2.0
executing finally clause
>>>
>>> divide(100, 0)
division by zero!
executing finally clause
>>>

例外を故意に発生させる:raise

例外を故意に発生させることが出来るのが、「raise」になります。

raise 例外」と指定することで簡単に例外処理を発生させることができます。

try:
  raise <例外①>
  raise <例外②>
except <例外①>:
  <例外発生時の処理①>
except <例外②>:
  <例外発生時の処理②>

下がサンプルコードになります。

try:
  raise BufferError
  except BufferError:
  print("BufferError: buffer overflow")
  exit(1)

例外発生時に何もさせない:pass

例外が発生した時に何もさせないのが、「pass」になります。

try:
  <例外が発生する可能性がある処理>
except:
  pass

下がサンプルコードになります。

x = 100
y = 0

try:
  result = x / y
except ZeroDivisionError:
  pass

組み込み例外とユーザー定義例外

例外には「組み込み例外」と「ユーザー定義例外」が存在します。

組み込み例外」とはPython内にある定義されている例外になります。

組み込み例外は下のマニュアルを確認しましょう。

参考組み込み例外

ユーザー定義例外」とはユーザーが定義する例外になり、ユーザー独自の例外を指定することができます。

大規模開発時にはユーザー定義例外を用意します。

下がサンプルコードになります。

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """

    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.

    Attributes:
    previous -- state at beginning of transition
    next -- attempted new state
    message -- explanation of why the specific transition is not allowed
    """

    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message

上記のように複数のユーザー定義例外を生成するために、定義されている例外の基底クラスを作成するのが一般的です。

ユーザー定義例外でも組み込み例外の名前付けと同様に、 「Error」で終わる名前で定義します。

関連記事

-Python

Copyright© スタートアップIT企業社長のブログ , 2020 All Rights Reserved.