この記事では、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のエラーレスポンスを効率的にハンドリングする方法を説明しました。このようにしてエラーレスポンスを適切に処理することで、ロバストなアプリケーションを構築することが可能です。
コメント