https://medium.com/eureka-engineering/go言語におけるエラーハンドリングを今一度振り返る-abe06c31daa4

こんにちは! エンジニアの臼井です。

この記事は、 eureka Advent Calendar 2017 2日目の記事です。

昨日は、梶原さんの ”モダンな情報システム”を目指しているeurekaが、今年で一番変わったお話をしたい。 という記事でした。

今日の記事では、Go言語のエラーハンドリングについて、標準のerrorインターフェースについて他言語における例外機構と比較しながら考えていきたいと思います。

error インターフェース

はじめに、Go言語には例外が存在せず、関数やメソッドが複数の返り値を返すことが可能であることを利用して、以下の様なイディオムでエラーハンドリングを実行することを示します。

複数の返り値の最後の値を error インターフェースを満たす型で返し、呼び出し元でそのエラーを元に処理を行います。panic-defer-recover を使用したエラーハンドリングは多くの場合推奨されません。

エラーが発生していない場合は nil を返却し、処理が正常終了したことを知らせます。

Go言語には正常系のエラー処理機構はこの error インターフェースを用いたものしか存在しないため、コードのそこかしこにこのイディオムが現れます。

これまでに書いた if err != nil の数は思い出すことは非常に困難です……

他言語における例外機構

さて、他言語における例外機構ですが、C#のメソッドのコード断片をサンプルコードとして利用します。 class や namespace の記述を省略しますが、基本的な構文は以下の様な感じになると思います。

整数の配列を引数にとり、その商を返す単純な関数ですが、わざとゼロ除算や配列インデックス外の参照が発生する可能性を持たせ、例外のメッセージを標準出力に出力した後 rethrow しています。

呼び出し元では発生したエラーのタイプによって例外の型が異なるため、それに応じたエラー処理が可能です。

error インターフェースと例外機構の比較

さて、ここでGo言語のエラー構文に戻ります。

error インターフェースを満たす型が返ってきて、その有無でハンドリングしているだけに見えます。

ここで、error インターフェースの実装を確認してみましょう。