7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go の http request 中に発生した本来のエラーを取得する!

Posted at

例えばこんな感じのコードを皆さんはよく書くはずです。

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 にラップされるらしいですよ!

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?