DEV Community

voluntas
voluntas

Posted on

format_error/1 のススメ

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

そこで 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"
Enter fullscreen mode Exit fullscreen mode

オレオレ 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">>.
Enter fullscreen mode Exit fullscreen mode

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

まとめ

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

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

Top comments (0)