Pythonの例外処理で使用する「try~except~else~finally」の使い方を紹介します。
例外処理を使用することで、python実行時の各環境の状態に依存した予期せぬエラーを処理することができます。
この記事では初心者向けに「例外処理」と「エラー」の違いや、
例外処理ごとに処理を分ける方法なども合わせて説明します。
例外処理が扱えると下のようなことも実装可能です。
iop
例外とは?エラーとは何が違うのか?
例外処理を説明する前に例外というものがあります。
例外とは、「様々なコンピュータの状態によって発生したエラー」を指します。
またエラーには構文エラーというものがあり、
これは「プログラミングが正しく書かれていないエラー」を指します。
図にすると下がエラーの全体イメージです。
つまり例外処理とは、「様々なコンピュータの状態によって発生したエラー時の処理」を指します。
例外処理の基本: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」で終わる名前で定義します。