Pythonでカスタム例外を用いたAPIのエラーレスポンスハンドリング

この記事では、Pythonでカスタム例外を用いてAPIのエラーレスポンスをハンドリングする方法について詳しく説明します。具体的なコード例とその解説、さらには応用例も含めてご紹介します。

目次

はじめに

APIを使用する際、成功レスポンスだけでなく、エラーレスポンスも考慮しなければなりません。特に、エラーレスポンスのハンドリングが不十分な場合、想定外の動作やクラッシュを引き起こす可能性があります。この記事では、Pythonでカスタム例外を作成し、それを用いてAPIのエラーレスポンスを適切にハンドリングする方法をご紹介します。

基本的なエラーハンドリング

Pythonでは`try`、`except`ブロックを用いてエラーハンドリングを行います。基本的な形式は以下のようになります。


try:
    # 何らかの処理
except 何らかの例外 as e:
    # 例外が発生した場合の処理

標準のHTTPエラーコードのハンドリング

Pythonの`requests`ライブラリを使用してAPIを呼び出す一般的な方法を考えてみましょう。


import requests

try:
    response = requests.get('https://api.example.com/data')
    response.raise_for_status()
except requests.exceptions.HTTPError as e:
    print(f'HTTPエラーが発生しました: {e}')

このコードでは`requests.exceptions.HTTPError`をキャッチしています。これにより、HTTPエラーが発生した場合にその情報を取得できます。

カスタム例外の作成

Pythonでカスタム例外を作成するには、基本的に`Exception`クラスを継承します。


class CustomAPIException(Exception):
    def __init__(self, status_code, message):
        self.status_code = status_code
        self.message = message
        super().__init__(self.message)

カスタム例外を用いたエラーハンドリング

カスタム例外を用いて、APIのエラーレスポンスをハンドリングしてみましょう。


try:
    response = requests.get('https://api.example.com/data')
    if response.status_code != 200:
        raise CustomAPIException(response.status_code, 'APIエラーが発生しました')
    data = response.json()
except CustomAPIException as e:
    print(f'ステータスコード: {e.status_code}, メッセージ: {e.message}')
except Exception as e:
    print(f'その他のエラー: {e}')

この例では、ステータスコードが200以外の場合に`CustomAPIException`を投げています。そして、その例外をキャッチしてエラーメッセージとステータスコードを出力しています。

応用例

応用例1: 複数のAPIエンドポイントでのハンドリング

同じ例外クラスを使って、複数のAPIエンドポイントに対応する例を考えます。


def fetch_data(api_endpoint):
    try:
        response = requests.get(api_endpoint)
        if response.status_code != 200:
            raise CustomAPIException(response.status_code, f'{api_endpoint}からのエラー')
        return response.json()
    except CustomAPIException as e:
        print(f'ステータスコード: {e.status_code}, メッセージ: {e.message}')

api_endpoints = ['https://api.example.com/data1', 'https://api.example.com/data2']
for endpoint in api_endpoints:
    data = fetch_data(endpoint)

応用例2: エラー内容に応じてリトライ

特定のエラー内容(例えば、ステータスコードが429 Too Many Requests)に応じて、リトライ処理を行う例です。


import time
def fetch_data_with_retry(api_endpoint, max_retries=3):
    retries = 0
    while retries < max_retries:
        try:
            response = requests.get(api_endpoint)
            if response.status_code != 200:
                raise CustomAPIException(response.status_code, 'APIエラーが発生しました')
            return response.json()
        except CustomAPIException as e:
            if e.status_code == 429:
                print('リクエストが多すぎます。リトライします。')
                time.sleep(5)
                retries += 1
            else:
                print(f'ステータスコード: {e.status_code}, メッセージ: {e.message}')
                break

まとめ

この記事では、Pythonでカスタム例外を作成し、APIのエラーレスポンスを効率的にハンドリングする方法を説明しました。このようにしてエラーレスポンスを適切に処理することで、ロバストなアプリケーションを構築することが可能です。

コメント

コメントする

目次