【初心者向け】Zaif API×Pythonでプチフィンテック7 異常への対応その2

前回から引き続き、今回もプログラム実行中に異常が発生した際の対応について説明していきます。

<スポンサーリンク>

今回対象とする異常

さて、前回、プログラム実行時に発生し得る異常として、①サーバ管理範疇の異常と②範疇外の異常の2つがあるという説明をしました。

前回、②への対応を実装しましたので、今回は①のサーバ管理範疇の異常について、その対応を実装していきます

異常の検出と対応方針

さて、サーバ管理範疇の異常が発生した場合、それをどのような形で検出できるのでしょうか?

ブラウザからWebサイトにアクセス時には、「http」という手順(手順のことを「プロトコル」と呼びます)に従って通信を行いますが、このhttpプロトコルでは、サーバ側の処理結果に応じて、サーバが決まったコードを返すような仕組みになっています

例えば、正常に処理が行われた場合は「200」というコードが返されますし、通信先のドメイン内で存在しないページにアクセスしようとした場合には、「404」というコードがサーバより返されます。この「404」というコードには、皆さん見覚えがあるのではないでしょうか?

参考まで、本ブログのドメイン(www.closetoyou.jp)配下の存在しないページにアクセスしようとした際には、以下のようにブラウザ上に「404」というコードが表示されます。

また、このコードの代表的なものとしては、以下が上げられます。

コード メッセージ 内容
200 OK 通信が正常に終了
403 Forbidden アクセス権限が無いページへのアクセス
404 Not Found 存在しないページへのアクセス
408 Request Timeout 通信が既定の時間内に完了しなかった
500 Internal Server Error サーバ内部にエラーが発生
502 Bad Gateway 通信経路上の機器にエラーが発生
503 Service Unavailable サービスが過負荷等により利用不能

なお、取引の集中時やネットワーク混雑時には、500番台のエラーがZaifサーバから返されることが多くあります。

さて、話を元に戻して、今回対象とする「サーバ管理範疇の異常をどう検出するか」ですが、通信を行うたびにサーバから返される、このコードをチェックしてやればよさそうです

では、これを踏まえて、早速プログラムを作成してみましょう。

実装

まずは、PyCharmを立ち上げ、新しくPythonファイルを作成の上、前回作成したプログラム内容をコピーしておきます。ここでは、「publictest3」という名称でファイルを作成しました。

それでは、順次、プログラムを修正していきましょう。

異常の検出と条件分岐の実装

さて、まずはtryブロックの中を、以下のように修正します。

・・・
try:
    response = requests.get('https://api.zaif.jp/api/1/last_price/' + CURRENCY_PAIR)
    if response.status_code == 200:
        print(response.text)
    else:
        # 異常発生時の処理を記述

・・・

変更内容について説明します。

まず、「#」から始まる行は「コメント行」と呼ばれるものであり、プログラムの実行には何ら影響を及ぼしません。

では、なぜこの行を入れているのかと言いますと、ここに後ほどコードを追記することを、備忘的に示しておくためです。

このようにコメントは、プログラムではなく、それを作成または利用する人間に対してのメッセージを書くために使います

さて、それ以外の変更点ですが、ぱっと見、「if」から始まる行と「else」の2行が追加され、もともと記述されていたprint文がifブロックの中に入れ込まれています。

このifとelseですが、

if 条件:
    #処理①
else:
    #処理②

という記述で、「条件に当てはまる場合は処理①を、それ以外の場合は処理②を実行する」という意味になります。このように、ある条件に応じて実行する処理を変えることを、「条件分岐」と呼びます。

それでは、この考えを今回の修正内容に当てはめると、条件、処理①、処理②はそれぞれ何に該当しますでしょうか?

条件は「response.status_code == 200」、処理①は「print(response.text)」、そして処理②は「#異常発生時の処理を記述」というコメント文になりますね。

ここで、条件に注目して下さい。第5回目の記事で、responseオブジェクトにはいくつか属性があるというお話をしました。その属性の1つに「status_code」というものがあるのですが、これが先ほど説明したサーバから返されるコードに他なりません

したがって、条件に記述されている内容は、「サーバから返されるコードが200(=正常に通信完了)であれば」というものになります。

そのため、今回の変更により、通信が正常に終了した場合にはその結果を文字列として表示し、そうでない場合には、異常発生時の対応処理を実施する(後ほど記述)という動作をプログラムがおこなうようになりました。

異常発生時の対応処理実装

続いて、ペンディングとしていた異常発生時の対応処理を実装していきましょう。

対応の内容は色々考えられますが、前回、例外を拾ってエラー対応を行う処理をプログラムに組み込みましたので、これと併せてエラー対応ができると楽ですね。ということは、現在コメントが書かれている行に、例外をわざと発生させる処理を記述してやればよさそうです。

これを踏まえて、プログラムを以下のように修正します。

・・・
try:
    response = requests.get('https://api.zaif.jp/api/1/last_price/' + CURRENCY_PAIR)
    if response.status_code == 200:
        print(response.text)
    else:
        print('サーバ管理範疇のエラー')
        raise Exception

except:
    print('例外発生')

もともとコメント行があった箇所に、print文とraiseから始まる行が追加されています。

print文はよいですね。単純に文字列を表示するだけの処理です。

そして次の行がポイントですが、「raise Exception」という記述で例外を意図的に発生させることができます

これにより、続くexceptブロックに制御が流れ、「例外発生」という文字列が表示されることになります。

テスト実行

今回のプログラム修正はこれで完了ですので、意図したとおりにプログラムが動くか、テスト実行してみましょう。

今回、エラーを意図的に発生させるため、getメソッドでアクセスする先のURLを

「’https://api.zaif.jp/api/1/last_price/’ + CURRENCY_PAIR」

から

「’https://api.zaif.jp/errortest’」

と存在しないページに設定し、プログラムを実行してみます。

すると、elseブロックのprint文が実行されて「サーバ管理範疇のエラー」という文字列が表示された後、今度はexceptブロックに制御が移り、「例外発生」という文字列が表示されるはずです。

終わりに

今回で、現物公開APIの利用方法と異常発生時の基本的な対応方法に関する説明は完了です。

次回からはしばらく、もう1つのAPIである現物取引APIの使用方法について説明していきたいと思います。

なお、現物取引APIを利用するためにはZaifの口座を有している必要があります。記事を読むだけではなく実践してみたい方で、口座を持っていない場合には、口座登録を済ませておく必要があることにご留意下さい。

カテゴリ:フィンテック
<スポンサーリンク>

シェアする

フォローする