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

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

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

この記事では初心者向けに「例外処理」と「エラー」の違いや、

例外処理ごとに処理を分ける方法なども合わせて説明します。

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

iop

あわせて読みたい
[Python] 例外処理で指定のデータ型以外を入力させない ブログなどの各種メディアではデータ型の確認方法は公開されていますが、 指定されたデータ型以外の入力を受け付けない書き方は公開されていません。 この記事では例外...

目次

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

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

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

またエラーには構文エラーというものがあり、

これは「プログラミングが正しく書かれていないエラー」を指します。

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

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」で終わる名前で定義します。

よかったらシェアしてね!
  • URLをコピーしました!
目次