例えばこんな感じのコードを皆さんはよく書くはずです。
ctx, cancel := context.WithCancel(context.Background())
req, _ := http.NewRequest("GET", url, nil)
resp, err := http.DefaultClient.Do(req.WithContext(ctx))
if err != nil {
return err
}
今回はこの return err
で受け取った error の値が下記のようになる事がありました。
Get https://example.com: context canceled
どうしても context canceled
のエラーだけを取得して、何かしらのアクションをしたかったのでずっとこんなコードを書いてました。
func errCheck(err error) error {
msg := err.Error()
if strings.Contains(msg, context.Canceled.Error()) {
// do something
return nil
}
return err
}
しかし上記のコードはなんか気持ち悪かったので、http パッケージのソースコードを読んだ所、下記のようにハンドリングできることがわかりました。
func errorCheck(err error) error {
if v, ok := err.(*url.Error); ok {
err = v.Err
if err == context.Canceled {
// do something
return nil
}
}
return err
}
どうやらリクエスト内で発生したエラーは何故か *url.Error
にラップされるらしいですよ!