Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go1.13以後のエラーハンドリングについて語ろう / Let's talk about error handling after Go 1 13

Go1.13以後のエラーハンドリングについて語ろう / Let's talk about error handling after Go 1 13

Koya IWAMURA

October 28, 2019
Tweet

More Decks by Koya IWAMURA

Other Decks in Programming

Transcript

  1. errors.Is • 値の比較 if err == sql.ErrNoRows { fmt.Println(err) }

    if errors.Is(err, sql.ErrNoRows) { fmt.Println(err) } Go1.13〜
  2. errors.As • 型の比較(assertion, switch)、キャプチャ if e, ok := err.(*url.Error); ok

    { fmt.Printf(“isTimeout: %v”, e.Timeout()) } var e *url.Error if errors.As(err, &e) { fmt.Printf(“isTimeout: %v”, e.Timeout()) } Go1.13〜
  3. `if err != nil` が無力化される func f() ([]byte, error) {

    resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } return ioutil.ReadAll(resp.Body) } func main() { a, err := f() if err != nil { fmt.Println(err) } fmt.Println(string(a)) }
  4. `if err != nil` が無力化される func f() ([]byte, error) {

    resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } a, err := ioutil.ReadAll(resp.Body) return a, fmt.Errorf(“%w”, err) } func main() { a, err := f() if err != nil { fmt.Println(err) } fmt.Println(string(a)) }
  5. `if err != nil` が無力化される func f() ([]byte, error) {

    resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } a, err := ioutil.ReadAll(resp.Body) return a, fmt.Errorf(“%w”, err) } func main() { a, err := f() if err != nil { fmt.Println(err) } fmt.Println(string(a)) } errがnilでも・・・
  6. `if err != nil` が無力化される func f() ([]byte, error) {

    resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } a, err := ioutil.ReadAll(resp.Body) return a, fmt.Errorf(“%w”, err) } func main() { a, err := f() if err != nil { fmt.Println(err) } fmt.Println(string(a)) } errがnilでも・・・ if文の中が走っちゃう
  7. `if err != nil` が無力化される func f() ([]byte, error) {

    resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } a, err := ioutil.ReadAll(resp.Body) return a, fmt.Errorf(“%w”, err) } func main() { a, err := f() if errors.Is(err, nil) { fmt.Println(err) } fmt.Println(string(a)) } errors.Isを使おう!