C言語の時はあまり悩まなかった・・・いや、どうするかは悩むけど言語的には悩まなかったエラーの返し方。
golangの場合は、だいたいerrorsというものを使っているようだ。
Pythonもそうだけど、戻り値を簡単に複数返すことができるというのは楽ですな。
私の場合、C言語ではboolを戻り値にして「成功かエラー」だけにすることが多い。
多いのだが、あまり考えたくないというのと、組み込みだと「エラーが起きる=リセットするしかない or バグ」ということがほとんどだったので、戻り値を用意してスタックを使ってしまうくらいだったらvoidでいいや、みたいな気持ちだったからだ。
ほら、エラーが起きたことを知らせるにしても、LEDの点滅とかブザー鳴動だし。
しかし、最近は組み込みじゃないプログラムを書くことが増え、「エラーをユーザに見せる」という技がいるようになってきた。そうするとboolではとても足りず、「intにするか・・・でも戻り値の変更はつらいので引数増やすか・・・でもそれも・・・」とさらに悩むということになってしまっている。
その点、複数の戻り値を同時に返すことができるし、戻り値の2番目にerrorsを返しがち、というルールもあるようなので、それに載っかるのが無難だろう。
ただ・・・個人的には暗黙のルールってのがどうも苦手で。
プロジェクトごととか個人のルールはあってしかるべきだが、言語でのルールは仕様に含めてしまってもいいのでは・・・。
いや、そうしたらしたで「なんでここまで縛られるんじゃー」って思うのは間違いないな。
それはともかく、errorsの使い方も調べる。
errors - GoDoc
https://godoc.org/github.com/pkg/errors
発生時はNew()かErrorf()で新規に作るか、伝えられたerrorsに情報を付加して返すかだろう。
WithMessage()とWrap()は同じもののような気がするが、実装はどうなんだろう?
01: func Wrap(err error, message string) error {
02: if err == nil {
03: return nil
04: }
05: err = &withMessage{
06: cause: err,
07: msg: message,
08: }
09: return &withStack{
10: err,
11: callers(),
12: }
13: }
01: func WithMessage(err error, message string) error {
02: if err == nil {
03: return nil
04: }
05: return &withMessage{
06: cause: err,
07: msg: message,
08: }
09: }
Wrap()は、WithMessage()+コールスタック、というところだろうか。
普段ならコードを書いて検証するところなのだが、今日は気分が乗らない・・・。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。