結論から言うと、try と except は「失敗する可能性がある処理」を安全に扱うための書き方です。
Pythonでは、存在しないファイルを開いたり、文字列を数値に変換したりするときにエラーが起きることがあります。
そのままにしておくとプログラム全体が止まりますが、try と except を使うと、エラー時の動きを自分で決められます。
この記事では、try と except の基本を、動くコードと一緒に整理します。
この記事でわかること
完成コード
完成コードは次の通りです。
from pathlib import Path
def read_amount(path: Path) -> int:
try:
text = path.read_text(encoding="utf-8")
return int(text.strip())
except FileNotFoundError:
print(f"ファイルが見つかりません: {path}")
return 0
except ValueError:
print(f"数値に変換できない内容です: {path}")
return 0
sample_path = Path("sample_amount.txt")
sample_path.write_text("1200\n", encoding="utf-8")
amount = read_amount(sample_path)
print(f"読み込んだ金額: {amount}円")
missing_amount = read_amount(Path("missing_amount.txt"))
print(f"見つからない場合の金額: {missing_amount}円")コードのポイント
このコードでは、テキストファイルから金額を読み込み、数値に変換しています。
tryの中に、失敗する可能性がある処理を書いていますFileNotFoundErrorでは、ファイルがない場合の処理を書いていますValueErrorでは、数値に変換できない場合の処理を書いています- エラー時は
0を返し、呼び出し側の処理が続くようにしています
例外処理は、エラーをなかったことにするためのものではありません。
「失敗したときに、プログラムとしてどう振る舞うか」を決めるために使います。
コードを順番に説明します
主要な処理を分けて説明します。
1. 失敗する可能性がある処理を try に入れます
try:
text = path.read_text(encoding="utf-8")
return int(text.strip())try の中には、エラーが起きる可能性がある処理を書きます。
この例では、ファイルの読み込みと、文字列から数値への変換を行っています。
ファイルが存在しなければ、読み込み時に FileNotFoundError が発生します。
ファイルの中身が "abc" のような文字列なら、int() のところで ValueError が発生します。
どちらも実務ではよく起きる失敗です。
入力ファイル、設定ファイル、CSVの値など、外から来るデータを扱うときは、失敗する可能性を前提にすると安全です。
2. ファイルがない場合を except で受け止めます
except FileNotFoundError:
print(f"ファイルが見つかりません: {path}")
return 0except FileNotFoundError は、ファイルが見つからないエラーだけを受け止めます。
この例では、メッセージを表示して 0 を返しています。
ここで大切なのは、どのエラーを扱っているのかを具体的に書くことです。
ただ except: と書くと、想定していないエラーまで受け止めてしまい、原因に気づきにくくなります。
実務のコードでは、エラーの種類を具体的に書くほど、後から調査しやすくなります。
3. 数値に変換できない場合も分けて扱います
except ValueError:
print(f"数値に変換できない内容です: {path}")
return 0ValueError は、値の形が処理に合わないときによく出る例外です。
ここでは、ファイルは読めたものの、中身を数値に変換できない場合に発生します。
ファイルがない場合と、ファイルの中身がおかしい場合では、原因も対応も違います。
そのため、except を分けると、エラーメッセージも具体的にできます。
エラー処理は、利用者や未来の自分に「何を直せばよいか」を伝える役割も持っています。
実務で使うときのポイント
実務で try と except を使うときは、まず「どこが失敗しそうか」を考えると書きやすくなります。
- ファイルを開く処理は、ファイルが存在しない可能性があります
- 文字列を数値に変換する処理は、値の形式が違う可能性があります
- APIや外部サービスを呼ぶ処理は、通信に失敗する可能性があります
- ユーザー入力を扱う処理は、想定外の値が入る可能性があります
一方で、何でも try に入れればよいわけではありません。
範囲が広すぎると、どの行で失敗したのか追いにくくなります。
基本は、失敗する可能性がある処理だけを小さく try に入れます。
そのうえで、想定できる例外を except FileNotFoundError や except ValueError のように具体的に書くと、保守しやすいコードになります。
第4章では、このあと 4-2 でよく出る例外の読み分け方、4-3 で finally の使いどころを扱います。try と except の形を先に押さえておくと、エラーメッセージを落ち着いて読めるようになります。