Python: 例外処理

Pythonでの例外処理についてまとめています。

最もシンプルな例外処理

Pythonの例外処理は、書こうと思えばいろいろと詳細に書けます。 try, except, else, finallyなどがあって結構面倒です。

最低限、エラーをキャッチできて、エラー内容をprint()で表示できればそれでいい。 最もシンプルな例外処理の書き方は?」となると次のようになります。

try:
	
	処理
	
except Exception as e:
	print(e)

上記が最も簡素な例外処理の書き方です。

「Exception」はシステム終了以外のエラーを全て拾ってくれますから、 「Exception」を指定しておけば事足ります。

「どうやって例外処理を書こうか?」 と迷ってしまったらとりあえず上記のコードでしのいでください。 後でいくらでも書き直せます。

例外処理

例外処理の書き方を説明します。 基本的な書き方は次の通りで、例外が発生した時の処理、 例外が発生しなかった時の処理、必ず最後に行う処理など細かく記述できます。

書式
try:
	例外が発生する可能性のある処理

except 例外クラス名: 
	例外が発生したときの処理

else:
	例外が発生しなかったときの処理
	
finally:
	必ず最後にする処理

else ブロックとfinally ブロックは省略可能です。
except の後に例外クラス名を指定しない場合は、 すべての例外の発生を処理できます。

exceptブロックを複数記述する

except ブロックはエラーの種類に応じて複数記述できます。 例えば、ファイルを扱う場合の例外処理を次のように分けることもできます。

except FileNotFound:
	処理

except FileExistsError:
	処理

複数の例外を1つのブロックにまとめる

複数の例外を1つのブロックにまとめることもできます。 その場合は()丸括弧で括り、カンマで区切ります。

except (FileNotFound, FileExistsError):
	処理

エラー情報を出力する

例外の情報を出力する場合は、次のように例外クラス名の後に as 変数と記述すると、 変数を使った情報出力ができます。

except Exception as e:
	print(e)  #エラー情報出力

組み込み例外

「組み込み例外」とは、Pythonにあらかじめ組み込まれている例外クラスのことです。
例えば、ファイルが存在しない場合に発生する FileNotFoundError など、 よく発生する例外が「組み込み例外」として用意されています。

階層構造

組み込み例外は階層構造になっており、 すべての例外クラスの基底クラスは「BaseException」です。 その下にシステム終了以外の基底クラスの「Exception」があります。 そして「Exception」の下に「ArithmeticError」「BufferError」などの さまざまな例外クラスが存在します。

一部のクラスしか載せていませんが、階層構造は次のようになっています。

BaseException
├ SystemExit
├ KeyboardInterrupt
├ GeneratorExit
└ Exception
  ├ ArithmeticError
  │ ├ FloatingPointError
  │ ├ OverflowError
  │ └ ZeroDivisionError
  ├ AssertionError
  ├ AttributeError
  ├ BufferError
  ├ EOFError
  └ OSError
    ├ FileExistsError
    └ FileNotFoundError

すべての階層構造を知りたい場合は公式サイトに載っています。
組み込み例外 — Python ドキュメント

主な組み込み例外

組み込み例外概要
BaseException全ての組み込み例外の基底クラス
Exceptionシステム終了以外の全ての組み込み例外が派生する基底クラス
ArithmeticError算術上の様々な例外
BufferErrorバッファの例外
ImportErrorimport の例外
MemoryErrorメモリの例外
NameErrorローカル、グローバルの名前の例外
OSErrorシステムの例外
RuntimeError未分類の例外
SyntaxError構文の例外
Warning警告カテゴリの基底クラス