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