DEV Community

loading...

format_error/1 のススメ

voluntas profile image voluntas ・1 min read

ライブラリにロギングを入れると訳わからなくなるので基本的に入れない事が普通です。

そこで ok/error の {error, Reason} をうまく使うというのをオススメします。
別にデファクトなわけではないです。好み問題だと思ってます。

file:format_error/1

format_error は file モジュールで出てきます。これは file モジュールでエラーが起きた場合に {error, Reason} で返ってきた Reason を format_error(Reason) とするとヒューマンリーダブルなエラーに変更してくれるという仕組みです。

1> file:format_error(einval).
"invalid argument"
2> file:format_error(eexist).
"file already exists"

オレオレ format_error/1

この仕組みをうまく使うことで format_error/1 をアプリ側でラッピングするという仕組みを使います。

format_error({missing_user_id, UserId}) ->
    %% format は io_lib:format/2 のラッピング
    format("MISSING-USER-ID | user_id=~p", [UserId]);
format_error(_Reason) ->
    <<"INTERNAL-ERROR">>.

あとはこれを lager:warning(format_error(Reason)) という形で突っ込むパターンが多いです。

まとめ

エラーメッセージは王道がなく、難しいと思っています。個人的には format_error/1 をうまく活用し Reason をそのまま食べさせロガーにはかせる仕組みが綺麗かなと思っています。

ちなみにエラーフォーマットは "ERROR-MESSAGE | key=value, key=value" key は sanke_case というルールで運用しています。

Discussion

pic
Editor guide