先日(2016/1/19)に大規模なTwitterのサーバー障害に見舞われました。その時に自分が運営していたサイトのログを確認してどのようなエラーがTwitter側から返ってきたか確認したいと思います。
なお、Ruby Twitter gemを使った上での結果です。
具体的にどのようなエラーが発生したか
Twitter::Error::ServiceUnavailable (Over capacity): Twitter::Error::InternalServerError (Internal error): Twitter::Error::RequestTimeout (Net::ReadTimeout):
までは分かるのですが、
Twitter::Error (784: unexpected token at '<!DOCTYPE html>
としまいにはJSONでなくHTMLを返されてしまったようで…鯖落ちした時のエラーのレスポンスの返り方はもう予測不可能ですねw
で、結局どう例外処理すればいいの?
結論としましては、
- まずはTwitter関連で発生したエラーのデフォルトの処理を記述する
(内容はTwitterがサーバーダウンした場合を想定) - TooManyRequests(API制限で利用不可)
Unauthorized(鍵垢、トークン無効などの理由で読み取り不可)
Forbidden(140字以上のツイートなどの理由で拒否)
などユーザー側の操作の理由で発生したエラーの捕捉
をしたほうがいいと思います。
例えばRailsで書くとするとこんな感じでしょうか
class ApplicationController < ActionController::Base #rescue_from節は下のほうほど優先順位が高いため、Twitter::Errorの例外は一番上に書きそのサブクラスの例外を下に記述すること。 rescue_from Twitter::Error, with: :twitter_server_error rescue_from Twitter::Error::TooManyRequests, with: :twitter_too_many_requests rescue_from Twitter::Error::Unauthorized, with: :twitter_unauthorized rescue_from Twitter::Error::Forbidden, with: :twitter_forbidden def twitter_server_error #Twitterが鯖落ちした時の処理を記述 end #以下同様にしてエラー時の処理を行う各メソッドを記述 end