Pythonのエラー処理完全ガイド:try, except, raiseを使いこなす
Pythonの例外処理(try, except, raise)を初心者向けに解説。エラーの種類、基本的な使い方、応用例、デバッグのコツを紹介。実践的なサンプルコード付き。
Pythonのエラー処理とは?
Pythonでプログラムを書いていると、予期しないエラー(例外)が発生することがあります。例えば、ゼロで割り算をしようとしたり、存在しないファイルを開こうとしたりするとエラーになります。こうしたエラーを適切に処理しないと、プログラムが途中で止まってしまいます。そこで役立つのが try, except, raise を使った例外処理です。
この記事では、Pythonのエラー処理の基本から応用までを、具体的なコード例を交えて解説します。
エラーの種類:構文エラーと例外
Pythonのエラーは大きく2つに分けられます。
ZeroDivisionError(ゼロ除算)、FileNotFoundError(ファイルが見つからない)、TypeError(型が合わない)などがあります。これらはtry-exceptで処理できます。try-exceptの基本
例外が発生しそうなコードを try ブロックで囲み、例外が発生した場合の処理を except ブロックに書きます。
try:
result = 10 / 0
except ZeroDivisionError:
print("ゼロで割ることはできません")
この例では、ZeroDivisionError が発生したときにだけ、exceptブロックが実行されます。エラーが発生しなければ、exceptブロックはスキップされます。
複数の例外を捕捉する
異なる種類の例外をまとめて捕捉したい場合は、タプルで指定します。
try:
num = int(input("数字を入力: "))
result = 10 / num
except (ValueError, ZeroDivisionError) as e:
print(f"エラーが発生しました: {e}")
ValueError は整数に変換できないとき、ZeroDivisionError はゼロで割ったときに発生します。
全ての例外を捕捉する
基底クラス Exception を使うと、ほとんどの例外を捕捉できます。ただし、あまり広範囲に捕捉すると、予期しないバグを見逃す可能性があるため注意が必要です。
try:
# 何らかの処理
except Exception as e:
print(f"エラー: {e}")
else節とfinally節
try-exceptには else と finally を追加できます。
try:
file = open("sample.txt", "r")
data = file.read()
except FileNotFoundError:
print("ファイルが見つかりません")
else:
print("ファイルの読み込みに成功しました")
finally:
file.close()
print("ファイルを閉じました")
raiseで意図的に例外を発生させる
raise を使うと、自分で例外を発生させることができます。例えば、関数の引数が不正な場合にエラーを通知したいときに使います。
def divide(a, b):
if b == 0:
raise ValueError("除数は0にできません")
return a / b
try:
result = divide(10, 0)
except ValueError as e:
print(e)
また、raise 単体で使うと、現在の例外をそのまま再送出できます。
try:
# 例外が発生する処理
except:
# ログを残すなど
raise # 同じ例外を再送出
カスタム例外の作成
既存の例外クラスを継承して、独自の例外を作成できます。
class MyCustomError(Exception):
pass
try:
raise MyCustomError("これはカスタムエラーです")
except MyCustomError as e:
print(e)
実践的なエラー処理の例
ファイル操作
import sys
def read_file(filename):
try:
with open(filename, "r") as f:
return f.read()
except FileNotFoundError:
print(f"ファイル {filename} が見つかりません", file=sys.stderr)
return None
except PermissionError:
print(f"ファイル {filename} を読み込む権限がありません", file=sys.stderr)
return None
数値入力の検証
def get_positive_integer():
while True:
try:
num = int(input("正の整数を入力: "))
if num <= 0:
raise ValueError("正の整数ではありません")
return num
except ValueError as e:
print(f"無効な入力です: {e}")
デバッグのコツ
logging モジュールを使ってエラー情報を記録すると後で分析しやすいです。def square_root(x):
assert x >= 0, "負の数の平方根は計算できません"
return x ** 0.5
まとめ
Pythonのエラー処理は、プログラムを堅牢にするために欠かせません。
適切なエラー処理を書くことで、ユーザーに優しいプログラムになります。ぜひ実践で活用してみてください。