Go のエラー処理はけっこう独特。なにをもってエラーかというと、次の interface を満たすだけ。
type error interface { Error() string }
めっちゃシンプル。でも、これだけで本当に実際にエラー処理やっていけるのか。
特定のエラーを判別する
エラーによって分岐を発生させたいときはどうするか。
- 単純な値比較で判別
- type assertion で判別
これについては、すでに詳しい記事がある。
【Golang Error handling】エラーの種類によって処理を分けるBESTな方法 - Qiita
スタックトレースや原因となるエラーを表示する
標準だとスタックトレースなんて一切出ない。なので、errors というパッケージを使って、Wrap したりする。 しかし、最近は↓に書く xerrors が現れたので、errors は使わない方向になる。
最近現れた xerrors とか
さいきん xerrors というパッケージが現れた。Go 1.13 からは標準の errors になる。 フォーマット文字列によって挙動がかわるの、気持ち悪いけど、これは互換のためらしい。
また、xerrors はいろいろミスりそうなので、静的解析でいろいろチェックしたほうが良い。
Go で静的解析して Go 1.13 から標準の xerrors とうまく付き合っていく - Qiita
こういうのもある
GitHub - morikuni/failure: failure is a utility package for handling application errors.
そもそも Go で複雑なエラー処理はしないほうが良い?
この記事にも書かれている。 Go言語におけるエラーハンドリングを今一度振り返る – Eureka Engineering – Medium
Go言語はそのシンプルな言語仕様が一つの大きな魅力であり利点ですが、通常の例外機構レベルのリッチなエラーハンドリングを常に実現しようとすると、アプリケーションコードがエラーハンドリングで埋め尽くされてしまうのではないでしょうか。
ということで…
- 型やエラーコードによる分岐が必要なほど複雑な処理はできるだけ書かない。
- 無理に他の言語の例外のまねをしない。
- どうしてもやりたいなら、今は xerrors を使うと良いのかもしれない
Keep it Simple!!