Errors Handling Talks at GopherCon2019

D7bdc8a7ccee78c64ca96e0ed4a7b070?s=47 Go Sagawa
August 26, 2019

Errors Handling Talks at GopherCon2019

GopherCon2019で話されたError Handling周りの話についてまとめています。

D7bdc8a7ccee78c64ca96e0ed4a7b070?s=128

Go Sagawa

August 26, 2019
Tweet

Transcript

  1. 1.

    Errors Handling Talks at GopherCon2019 GopherCon 2019 報告会 by Gopher道場

    Aug 26, 2019 Go Sagawa and factory,inc. @go_sagawa
  2. 6.

    初心者のように学ぼう 1.Recap “Error Handling in go” 文法(Syntax) 概念(concept) jsonのパース方法 データのシリアライズとは?

    ライブラリのインポート方法 依存性(dependency)とは? どうやってエラーをキャッチす る? エラーハンドリングとは?
  3. 8.

    Pros and Cons 1.Recap “Error Handling in go” Pros Cons

    You get to define the importance of errors You get to define the importance of errors
  4. 9.

    Pros and Cons 1.Recap “Error Handling in go” 良い所 悪い所

    エラーの重要性を自分で定義できる エラーの重要性を自分で定義しなければいけ ない...
  5. 14.

    エラーハンドリングに求められる要件 1.Recap “Error Handling in go” • エラーのでる順番を追える • 問題にあるコードにたどりつける

    • エラーの内容により処理を変更できる • ログレベル、エラーコード、Webならレスポンス コードでカテゴライズできる • アプリケーション固有の情報を持てる • これらのI/Oができる
  6. 15.

    エラーを扱う構造体 1.Recap “Error Handling in go” package errors type Error

    struct { Op Op //オペレーション Kind Kind //カテゴリ Err error //wrapされたエラー Severity logrus.Level //ログレベル //... その他アプリケーション固有値 }
  7. 16.

    エラーを扱う構造体 1.Recap “Error Handling in go” package errors type Error

    struct { Op Op //オペレーション Kind Kind //カテゴリ Err error //wrapされたエラー Severity logrus.Level //ログレベル //... その他アプリケーション固有値 } Op: type Op string オペーレーション。何をして エラーが発生したか?独 自のスタックトレースを作 成するためのもの。特徴的 な部分なので後述。
  8. 17.

    エラーを扱う構造体 1.Recap “Error Handling in go” package errors type Error

    struct { Op Op //オペレーション Kind Kind //カテゴリ Err error //wrapされたエラー Severity logrus.Level //ログレベル //... その他アプリケーション固有値 } Kind: type Kind string 発表者の例では NotFound等のレスポンス コードを分けるもの。 アプリケーション次第で は、エラーコードにする事
  9. 18.

    エラーを扱う構造体 1.Recap “Error Handling in go” package errors type Error

    struct { Op Op //オペレーション Kind Kind //カテゴリ Err error //wrapされたエラー Severity logrus.Level //ログレベル //... その他アプリケーション固有値 } Severity: 発表者は sirupsen/logrusを使って いるようです。 debug/info/warning等 が設定されます。
  10. 25.

    独自スタックトレースの良い所 1.Recap “Error Handling in go” • 自分のコードしか出ない • 読みやすい

    • パースしやすいし、調べたり検索しやすい • どこが悪いかのみならず、どこに影響を与えるか も掴みやすい
  11. 27.

    まとめ 1.Recap “Error Handling in go” • Goのエラーのコンセプト ◦ エラー=値の集合体

    ◦ 入力と出力が必要となる ◦ 必要要件を考えて設計が必要 • エラー構造体を定義し、階層化すると良い • スタックトレースも独自実装できる ◦ シンプルにできる
  12. 29.

    goのエラーハンドリングの過去と未来(2008,2009) 2.Go 2でのError handlinge • オリジナルのsyscall errorはint型で定義 • そこから2時間でerror typeができた

    • 2009には今の形(interface)になった • pkg/errorsなどのライブラリが作成された →今のスタイルが形づくられていった
  13. 31.

    goのエラーハンドリングの過去と未来(Go2) 2.Go 2でのError handlinge • 2018、handlerとcheckが提案された • 2019、tryが提案された ◦ が、提案は破棄された

    →可読性やデバッグのしやすさ、Goのシンプルさを 損なわないかなど、難しい問題をはらんでいる
  14. 32.

    Go2のErrorHandling、反応やフィードバックの抜粋 2.Go 2でのError handlinge • pkg/errorsでやりたい事ができてしまっている • 賛否両論になりそうなものは入れないのかな? • tryは問題の規模に関して対応が微妙に思う

    • 既存のコードの互換性を考えているうちは直せないかも • 結局、if err :=で良いのでは • handleのネストはいらなそう • Checkはシンタックスシュガーとしては良さそう
  15. 35.

    リンク、参考にしたもの 3.Summary https://github.com/gophercon/2019-talks/blob/master/MarwanSulaiman-HandlingGoErrors/handling-go-errors.pdf Handling go errors のスライド https://about.sourcegraph.com/go/gophercon-2019-handling-go-errors Handling go

    errors のLiveBlog https://about.sourcegraph.com/go/gophercon-2019-on-the-road-to-go-2 On the road to Go 2のLiveBlog GopherCon2019 参戦記 DAY2 (7/25) https://note.mu/hgsgtk/n/n7b11d5c32402 @hgsgtkさんの参加レポート。On the road to Go 2の内容がまとめられています
  16. 36.

    リンク、参考にしたもの 3.Summary Go2ErrorHandlingFeedback https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback Go2のエラーハンドリングに関するフィードバック Go 2 Draft DesignsのError Handlingについて

    http://inukirom.hatenablog.com/entry/2018/09/27/234124 @morikuniさんのGo2のhandler,checkに関する提案 Go 2 feedback from Tokyo event (error handling) https://docs.google.com/document/d/1yTDMP0E9hlJyLnKyr-6XL84RogiiwDnk0fMg9HDOKkc/edit#heading=h.fy8rnze9tll5 東京の有志による、Go2のエラーハンドリングに関するフィードバッグ Proposal: A built-in Go error check function, "try" https://github.com/golang/go/issues/32437 tryについてのプロポーザル