Day 5・ファイル・API連携(外の世界とつながる)
例外処理 try/except(AIやネットワークは失敗する前提)
try/exceptで失敗を想定し、落ちない・原因が分かるコードを書く。
外の世界は、必ず失敗する
自分の中だけで完結する計算はほぼ確実に成功します。しかし、ファイルを読む・APIを叩くといった「外」とのやりとりは、必ず失敗しうると考えるべきです。ファイルが存在しない、ネットワークが切れている、APIが混んでいて応答しない、AIが想定外の返答をする。こうした失敗は「例外」として起こりえます。失敗を想定していないコードは、そこでプログラム全体が停止(クラッシュ)します。
例外(exception)とは何か
例外とは、プログラムの実行中に起きる「異常事態の通知」です。存在しないファイルを開こうとすれば FileNotFoundError、辞書にないキーを取れば KeyError、といった具合に、Pythonは種類ごとに名前の付いた例外を投げます。何も対処しないと、この例外がプログラムのてっぺんまで伝わり、赤いエラー表示とともに処理が止まります。
try / except: 失敗を受け止める
try ブロックに「失敗するかもしれない処理」を書き、except ブロックに「失敗したときにどうするか」を書きます。こうすると、例外が起きてもプログラムは止まらず、except の中の処理に切り替わります。ポイントは、握りつぶさず、何が起きたかが分かるようにすることです。
import requests
try:
res = requests.get("https://api.example.com/data", timeout=10)
res.raise_for_status() # 400/500番台なら例外を投げる
data = res.json()
print("取得成功:", data)
except requests.exceptions.Timeout:
print("時間内に応答がありませんでした。あとで再試行します")
except requests.exceptions.RequestException as e:
# 通信全般の失敗をまとめて受け止める
print("通信エラーが発生しました:", e)except: pass で握りつぶさない
except の中を pass だけにして、エラーを黙って無視するのは危険です。問題が起きても気づけず、原因調査もできなくなります。最低でも「何が起きたか」をログや画面に出す。むやみに全部を except Exception で受けず、想定する失敗を具体的に書くのが基本です。
危険: 握りつぶし
失敗しても何も分からず、静かに壊れる。
try:
data = res.json()
except:
pass # 何が起きたか誰も分からない良い: 種類を絞って通知
想定する失敗を明示し、原因が分かる形で扱う。
try:
data = res.json()
except ValueError as e:
print("JSONとして解釈できません:", e)
data = Noneelse と finally、そして再試行の考え方
try には、成功したときだけ動く else、成功・失敗にかかわらず必ず動く finally を付けられます。finally は「後始末」に向きます。また、ネットワークの一時的な失敗は、少し待ってもう一度試すと成功することがあります。これを再試行(リトライ)と呼びます。AIのAPIも混雑時に一時的に失敗することがあるので、数回だけ再試行する設計は実務でよく使います。
import time
import requests
def fetch(url, retries=3):
for attempt in range(1, retries + 1):
try:
res = requests.get(url, timeout=10)
res.raise_for_status()
return res.json()
except requests.exceptions.RequestException as e:
print("試行", attempt, "回目 失敗:", e)
if attempt == retries:
raise # 最後まで失敗したら諦めて例外を上げる
time.sleep(2) # 少し待ってから再試行
result = fetch("https://api.example.com/data")なぜ「失敗する前提」で書くのか
AI時代のプログラムは、外部のAPIやAIサービスに依存します。これらは自分ではコントロールできず、遅い・落ちる・想定外の応答を返す、が普通に起きます。失敗を前提に、落ちない・原因が分かる・必要なら再試行する、という作りにしておくことが、信頼できるプログラムの条件です。
AIにはこう聞く
「このAPI呼び出しに例外処理を追加して。Timeoutと通信エラーを分けて扱い、最大3回まで2秒間隔で再試行して。握りつぶさずログを残して」のように、想定する失敗と再試行の条件を具体的に伝えると、実務水準のエラーハンドリングが返ってきます。返ってきたコードは except が広すぎないか(bare except や except Exception だけになっていないか)を確認しましょう。
読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
try / except を使う主な目的として最も適切なものはどれですか。
例外処理で避けるべき書き方はどれですか。
ネットワークやAIのAPIを扱うコードで「失敗する前提」の設計が重要な理由を説明してください。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。