Rails アンチパターン - ファイア・アンド・フォーゲット(Fire and Forget)
引き続きRails AntiPatternsという本を読んでいます。
https://www.amazon.co.jp/dp/B004C04QE0/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
前回は4 Controllersの2つめ「Fat Controller」についてまとめました。 waterlow2013.hatenablog.com
今回は5 Servicesの1つめ「Fire and Forget」についてまとめていきます。 ここで言うServicesとは外部サービスのことで、サービスクラスやアプリケーションサービスのことではありません。
Fire and Forget
外部サービスを利用するとき、レスポンスの扱いとしては以下のようなものがある。
- レスポンスをチェックし、エラーごとに適切な処理を行う。
- 成功、エラーのみチェックする。
- 何もチェックしない。
今回のアンチパターンは3つ目のケース。コントローラで直接呼んでいるとなるとユーザに500エラーを返すことになってしまう。
Solution: Know What Exceptions to Look Out For
発生するエラーを列挙しておき、適切にハンドリングする。たとえばHTTPクライアントなら以下のようなエラーがある。
HTTP_ERRORS = [Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError]
rescue => e
しないのは、Timeout::Error
がRuntimeError
を継承していないためらしいが、今ならRuntimeError
を継承しているので、雑にやりたければrescue => e
でもいいと思う。
Message in a Bottle
config.action_mailer.raise_delivery_errors
の設定に気をつける- エラーには大きく分けて2種類ある。クライアント側とサーバ側
- クライアント側のエラー(メールアドレスがおかしい等)はユーザに即通知する
- サーバ側のエラーはスタッフに通知する等して、何か対応を入れる。
You Don’t Know What You Don’t Know
- rescueしすぎない
- 少なめのrescueから初めて必要なものを追加する
- エラーログサービス(NewRelic, errbit等)も重要
- エラーハンドリングの詳しくはchapter10を
まとめ
特に違和感を感じたところはなかったです!外部サービスを叩くものは常にエラーが起こりうるという扱いをするのが自然なんだなと思いました。
あとは早めにchapter10を読みたい。