LoginSignup
7
2

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