Erlang OTP アプリケーションのエラー処理

Erlang OTP アプリケーションのエラー処理について書かれた記事をあまり見かけないのでまとめてみました。
application -> supervisor -> workers という構成を想定。

application:start(app) 中のエラー

application:start/1 中のエラーは戻り値 で分かる。{error, Reason} になる。Reason をエラー出力し init/stop。
特に application:start/2 の中で supervisor を立ち上げている場合 supervisor が worker を起動できないと {error, {shutdown, _}} となるので特別にユーザーに分かりやすいメッセージに変更するのもあり。

worker で致命的なエラーが発生した場合

複数ある worker のうち 1つが致命的なエラーに遭遇した場合。例えば意図せぬデッドロックとか。アプリケーション全体を止めたい。
色々調べたが、supervisor の機能では全体を止めることはできなさそう。gen_event で child の exit イベントを受けることができるようだが複雑なのでパス。supervisor は children を再起動するけど、それ以上は何もしてくれないんだな。


この件は @voluntas さん @kenji_rikitake さんにアドバイスいただいて、init:stop/1 を呼ぶのが良さそうだという結論に。こうすれば port も閉じられるし application:stop も呼ばれる。

worker で想定しているエラーが起きた場合

単純に exit/1 する。supervisor で指定した restart policy に従い再起動される。