LoginSignup
41
38

More than 3 years have passed since last update.

Python API通信時の例外処理

Posted at

仮想通貨の自動売買BOTを作成した際に、
取引所のAPIを利用したところ取引所側で頻繁にエラーが検知されるため
対策として例外処理を実装しました。
忘れないために自分用のメモとして残します。

例外処理とは

簡単にサーバーエラーなどの対策です。
自分の書いたコードが正しい場合でも、実行時にエラーが発生することがあります。
例えば、外部サーバーにリクエストした時に、サーバーが混雑していたり、
一時的にメンテナンス中でサーバーが動いていない場合など、
レスポンス結果としてサーバーエラー(エラーコード)などが返ってきてしまいます。
特に自動売買BOTの様な自動で動く様なプログラムは
サーバーエラーが原因で毎回停止されてしまうと困ります。。。(もはや自動売買BOTではない)

対策としてtry-except文(例外処理)を記述することで予期せぬエラーを未然に防ぐことができます。

HTTPステータスコード

リスクエストに対して正しいレスポンスが得られたかどうかというのはHTTPステータスコードで参照できます。
下記はHTTPステータスコードの一部で、大分類はこの様になっています。
私はよく500番台のエラーが返ってきていました。

  • 100番台:処理中
  • 200番台:成功
  • 300番台:リダイレクト
  • 400番台:クライアントエラー
  • 500番台:サーバーエラー
sample.py
response = requests.get("https://***********")
print(response.status_code)

HTTPステータスコードは上記コードの様にレスポンスオブジェクト.status_codeで確認できます。

try-except文

sample.py
try:
    response = requests.get("https://***********")
    response.raise_for_status() # 
    print(response.status_code)
except requests.exceptions.RequestException as e:
    print("エラー : ",e)

try:部分に例外が発生する可能性があるが、実行したい処理を
except:部分に例外が発生したときの処理を記述。

上記のコードの場合、外部サーバーにGET方式でリクエスト通信をしレスポンス結果に対して
raise_for_status()メソッドでHTTPステータスコードを確認し200番台であればtry:部分のみ実行されます。
反対にHTTPステータスコードが200番台以外であれば例外が発生したとみなし
except:部分が実行されます。

raise_for_status()メソッドは、HTTPステータスコードが200番台か確認し、
200番台以外であれば、例外を起こす、つまりエラーを吐き出して停止します。

exceptは、except 例外型 as 変数名:という書き方をすることで、
変数に例外オブジェクト(エラーメッセージなど)を格納して使用することができる。
変数名は任意の名前を指定できるが、eerrと書くことが一般的である。
変数を出力することでエラーの内容を確認できる。
また例外型については「ライブラリ名 例外処理」、「ライブラリ名 error handling」などで検索すると
大抵の場合は知りたいことがしれます。

else節

sample.py
try:
    response = requests.get("https://***********")
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print("エラー : ",e)
else:
    print("正常に処理されました")

else:部分に、例外が発生せず正常終了したあとに行う処理を記述。
例外が発生し、except:部分が実行された場合は、else:部分は実行されない。

finally節

sample.py
try:
    response = requests.get("https://***********")
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print("エラー : ",e)
else:
    print("正常に処理されました")
finally:
    print("終了時に常に処理します")

finally:部分に、例外の発生に関わらず必ず最後に行いたい処理を記述。
else:finally:を同時に使うこともできる。
正常終了時はelse:の処理が実行されたあとにfinally:の処理が実行される。

41
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
38