Pythonのtry/exceptを学ぼう!エラー処理の基本と実践パターンをわかりやすくご紹介

Pythonでプログラムを書く際、ファイルが見つからない、ゼロで割り算をしてしまうなど、さまざまなエラーに遭遇することがあります。
try/except文は予期せぬエラーを適切に処理し、プログラムの安定性を大幅に向上させる重要な仕組みです。
本記事では、try/except文によるエラー処理の基本構文から実際の開発現場で役立つ実践テクニックまで、初心者の方にも分かりやすく段階的に解説します。
Contents
Pythonのtry/exceptとは
Pythonのtry/exceptは、プログラム実行中に発生するエラーを適切に処理する仕組みです。
エラーが発生する可能性のあるコードをtryブロックに記述し、エラー時の処理をexceptブロックに記述します。
これにより、プログラムがエラーで停止することを防げます。
Pythonのtry/exceptの基本構文
基本的な構造は、tryブロック、exceptブロック、そして必要に応じてelseブロックとfinallyブロックで構成されます。
tryブロックには実行したいコードを記述し、exceptブロックには例外クラスと例外発生時の処理を記述します。
try:
# 例外が発生する可能性のあるコード
result = 10 / 0
except ZeroDivisionError:
# 特定の例外に対する処理
print(“ゼロで割ることはできません”)
tryブロックとexceptブロックの関係性
tryブロックは例外が発生する可能性のあるコードを実行します。
例外が発生した場合はtryブロックの実行を停止し、該当するexceptブロックを実行します。
try:
numbers = [1, 2, 3]
print(numbers[5]) # IndexError が発生
print(“この行は実行されません”) # 例外発生後は実行されない
except IndexError:
print(“リストの範囲外にアクセスしました”)
try/exceptの使い方
try/exceptの具体的な書き方を見ていきましょう。
特定の例外をキャッチする方法
except文でエラーの種類を指定します。
try:
number = int(input(“数字を入力してください: “))
result = 10 / number
print(f”結果: {result}“)
except ValueError: # 数値変換エラーのみをキャッチ
print(“数字以外が入力されました”)
注意点として、複数のexcept節を記述する場合は、より具体的な例外から順番に記述する必要があります。
複数の例外を同時に処理する方法
タプルで複数の例外を指定できます。
try:
file = open(“data.txt”, “r”)
number = int(file.read())
result = 100 / number
except (FileNotFoundError, ValueError, ZeroDivisionError):
print(“ファイル読み込みまたは計算でエラーが発生しました”)
例外オブジェクトから情報を取得する方法
asキーワードでエラー詳細を取得します。
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f”エラーの詳細: {e}“) # エラーの詳細: division by zero
elseブロックの活用
例外が発生しなかった場合にのみ実行されます。
try:
number = int(input(“数字を入力: “))
except ValueError:
print(“無効な入力です”)
else:
print(f”入力された数字は{number}です”) # エラーがない場合のみ実行
finallyブロックの活用
例外の有無に関わらず必ず実行されます。
try:
file = open(“data.txt”, “r”)
content = file.read()
except FileNotFoundError:
print(“ファイルが見つかりません”)
finally:
if ‘file’ in locals():
file.close() # エラーの有無に関わらずファイルを閉じる
例外の再送(raise)
raise文で例外を再度発生させます。
try:
result = 10 / 0
except ZeroDivisionError:
print(“ゼロ除算エラーをログに記録しました”)
raise # 同じ例外を再度発生させ、呼び出し元にエラーを伝えます。
try/exceptでよくある例外や種類
実際の開発現場でよく遭遇する例外を見ていきましょう。
ZeroDivisionError
数値をゼロで割ろうとした際に発生する例外です。
try:
result = 10 / 0 # ZeroDivisionErrorが発生
except ZeroDivisionError:
print(“ゼロで割ることはできません”)
result = 0 # デフォルト値を設定
ValueError
不適切な値が関数へ渡された場合に発生する例外です。
try: # 文字列を数値に変換する際のエラー
number = int(“abc”) # ValueErrorが発生
except ValueError:
print(“数値に変換できない文字列です”)
number = 0 # デフォルト値を設定
TypeError
関数の引数に想定していない型が渡された場合や、異なる型同士で演算をおこなう際によく発生します。
try:
result = “文字列” + 123 # TypeErrorが発生
except TypeError:
print(“文字列と数値は直接結合できません”)
result = “文字列” + str(123) # 型変換して対応
isinstance()関数を使って防止できます。
def calculate_sum(a, b):
if not (isinstance(a, (int, float)) and isinstance(b, (int, float))):
print(“数値以外が渡されました”)
return 0
return a + b
# 正常なケース
result = calculate_sum(10, 20) # 30
# エラーを防ぐケース
result = calculate_sum(“文字列”, 30) # “数値以外が渡されました” と出力され、0を返す
FileNotFoundError
存在しないファイルやディレクトリにアクセスしようとした場合に発生する例外です。
try:
with open(“存在しないファイル.txt”, “r”) as file: # FileNotFoundErrorが発生
content = file.read()
except FileNotFoundError:
print(“指定されたファイルが見つかりません”)
content = “” # 空文字列を設定
os.path.exists()でエラーを事前に回避できます。
import os
# 存在確認してからファイルを開く
file_path = “example.txt”
if os.path.exists(file_path):
with open(file_path) as file:
content = file.read()
else:
print(f”{file_path}が見つかりません”)
content = “”
# ディレクトリの存在確認も重要
dir_path = “data”
if not os.path.exists(dir_path):
os.makedirs(dir_path)
try/exceptの使い方の注意点
避けるべきはexcept Exceptionの多用です。すべての例外を一括で捕捉し、予期しないエラーまで隠してしまいます。
# 避けるべき書き方
try:
result = 10 / 0
file = open(“nonexistent.txt”)
except Exception:
pass # エラーを隠蔽してしまう
適切な例外処理では、発生する可能性のある具体的な例外を指定します。
# 推奨される書き方
try:
result = 10 / user_input
except ZeroDivisionError:
print(“ゼロで割ることはできません”)
except ValueError:
print(“数値を入力してください”)
また、エラーが発生した際は、ログ出力や適切な通知をおこなうことが大切です。
まとめ
Pythonのtry/except文は、プログラムの安定性向上に欠かせない機能です。基本構文から実践的な使い方まで理解すると、エラーに強いプログラムを作成できます。まずは身近なファイル操作や数値計算でtry/except文を実践してみましょう。