Py初めてのPython

Day 5ファイル・API連携(外の世界とつながる)

例外処理 try/except(AIやネットワークは失敗する前提)

try/exceptで失敗を想定し、落ちない・原因が分かるコードを書く。

外の世界は、必ず失敗する

自分の中だけで完結する計算はほぼ確実に成功します。しかし、ファイルを読む・APIを叩くといった「外」とのやりとりは、必ず失敗しうると考えるべきです。ファイルが存在しない、ネットワークが切れている、APIが混んでいて応答しない、AIが想定外の返答をする。こうした失敗は「例外」として起こりえます。失敗を想定していないコードは、そこでプログラム全体が停止(クラッシュ)します。

例外(exception)とは何か

例外とは、プログラムの実行中に起きる「異常事態の通知」です。存在しないファイルを開こうとすれば FileNotFoundError、辞書にないキーを取れば KeyError、といった具合に、Pythonは種類ごとに名前の付いた例外を投げます。何も対処しないと、この例外がプログラムのてっぺんまで伝わり、赤いエラー表示とともに処理が止まります。

try / except: 失敗を受け止める

try ブロックに「失敗するかもしれない処理」を書き、except ブロックに「失敗したときにどうするか」を書きます。こうすると、例外が起きてもプログラムは止まらず、except の中の処理に切り替わります。ポイントは、握りつぶさず、何が起きたかが分かるようにすることです。

PYTHON
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)
APIの呼び出しを try/except で守る

except: pass で握りつぶさない

except の中を pass だけにして、エラーを黙って無視するのは危険です。問題が起きても気づけず、原因調査もできなくなります。最低でも「何が起きたか」をログや画面に出す。むやみに全部を except Exception で受けず、想定する失敗を具体的に書くのが基本です。

危険: 握りつぶし

失敗しても何も分からず、静かに壊れる。

PYTHON
try:
    data = res.json()
except:
    pass  # 何が起きたか誰も分からない

良い: 種類を絞って通知

想定する失敗を明示し、原因が分かる形で扱う。

PYTHON
try:
    data = res.json()
except ValueError as e:
    print("JSONとして解釈できません:", e)
    data = None

else と finally、そして再試行の考え方

try には、成功したときだけ動く else、成功・失敗にかかわらず必ず動く finally を付けられます。finally は「後始末」に向きます。また、ネットワークの一時的な失敗は、少し待ってもう一度試すと成功することがあります。これを再試行(リトライ)と呼びます。AIのAPIも混雑時に一時的に失敗することがあるので、数回だけ再試行する設計は実務でよく使います。

PYTHON
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に噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

try / except を使う主な目的として最も適切なものはどれですか。

Q2

例外処理で避けるべき書き方はどれですか。

Q3

ネットワークやAIのAPIを扱うコードで「失敗する前提」の設計が重要な理由を説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。