Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
labelerrとsuberrを作った話 / created labelerr and suberr
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
nametake
December 18, 2018
Technology
1
900
labelerrとsuberrを作った話 / created labelerr and suberr
https://golangtokyo.connpass.com/event/111077/
nametake
December 18, 2018
Tweet
Share
More Decks by nametake
See All by nametake
実例マッピングで要件のレビューサイクルを回してる話 / Example Mapping Review Cycle
nametake
1
1.5k
アルプ T-QAオンボーディング資料(2022年9月版) / Alp T-QA onboarding 2022-09
nametake
0
1.7k
定式化と自動化に取り組みますという話 / Work on formulation and automation
nametake
0
1.1k
QAエンジニアが実例マッピングを2ヶ月運用した話 / Example Mapping for 2 months
nametake
3
7.1k
1人目QAエンジニアよもやま話 / QA Test Talk Vol.1
nametake
4
740
アルプでのAgile Testing / Alp Agile Testing
nametake
1
2.5k
CFD-Editorというツールを作ってみた話 / Made CFD-Editor
nametake
1
410
スタートアップで1人目QAエンジニアになった話 / Startup first QA
nametake
3
1.5k
テスト技法の話 / Testing techniques
nametake
5
4.9k
Other Decks in Technology
See All in Technology
CDK対応したAWS DevOps Agentを試そう_20260201
masakiokuda
1
120
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.3k
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1k
予期せぬコストの急増を障害のように扱う――「コスト版ポストモーテム」の導入とその後の改善
muziyoshiz
0
660
オープンウェイトのLLMリランカーを契約書で評価する / searchtechjp
sansan_randd
3
550
【NGK2026S】日本株のシステムトレードに入門してみた
kazuhitotakahashi
0
280
学生・新卒・ジュニアから目指すSRE
hiroyaonoe
1
370
Digitization部 紹介資料
sansan33
PRO
1
6.7k
Frontier Agents (Kiro autonomous agent / AWS Security Agent / AWS DevOps Agent) の紹介
msysh
3
110
しろおびセキュリティへ ようこそ
log0417
0
250
ゼロから始めたFindy初のモバイルアプリ開発
grandbig
2
610
小さく始めるBCP ― 多プロダクト環境で始める最初の一歩
kekke_n
0
260
Featured
See All Featured
Docker and Python
trallard
47
3.7k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
Color Theory Basics | Prateek | Gurzu
gurzu
0
190
Why Our Code Smells
bkeepers
PRO
340
58k
How to make the Groovebox
asonas
2
1.9k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Navigating Weather and Climate Data
rabernat
0
85
Speed Design
sergeychernyshev
33
1.5k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
150
Context Engineering - Making Every Token Count
addyosmani
9
640
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
77
Transcript
labelerrͱ suberrΛ࡞ͬͨ @nametake
ࣗݾհ
Shogo Nameki @nametake Go, Vim
Error handling
Έͳ͞Μ
GoͷError handling ͖Ͱ͔͢ʁ
ͪΖΜ ͖Ͱ͢ΑͶʁ
ࢲ͖Ͱ͢
͖ͳΜͰ͕͢……
StackTraceͱ͔ ErrorͷݪҼͱ͔ ແͯ͘ࠔΔ
ͦΜͳ͋ͳͨʹʂ
pkg/errors
Stack Trace͕ Errorʹͭ͘ʂ
errors.CauseͰ ݪҼΛऔΓग़ͤΔʂ
͜Ε͑͋͞Ε ࠔͬͨ͜ͱ ى͜Βͳ͍ʂʂʂ
Θ͚Ͱͳ͔ͬͨ
ྫ͑
WebΞϓϦͰͷ Error Handling
4xx 5xx
4xxϢʔβʔͷ ૢ࡞ʹΑͬͯ ൃੜ͢Δ
4xxͱ5xx ҧ͏ͷͱͯ͠ औΓѻ͍͍ͨ
Go෦తʹ ͲͬͪError (e.g. NotFound)
ൃੜݯͰ 4xxͱ͔5xxͱ͔ ҙࣝ͠ͳ͍
errors.CauseͰ ۠ผͰ͖ͳ͍
΄͔ʹ
None
None
ͲΜͳઃܭͰ
ϏδωεϩδοΫ (DomainϩδοΫ)
Domain Error
Errorͷதͷ Domain ErrorΛ औΓग़͍ͨ͠ (e.g. middleware)
ઌʹผͷError͕ ൃੜ͍ͯͨ͠߹ errors.Cause ͑ͳ͍
ͦͷ݁Ռ
if err := f(); err != nil { return errors.Wrap(
ErrDomain, err.Error(), ) }
if err := f(); err != nil { return errors.Wrap(
ErrDomain, err.Error(), ) }
if err := f(); err != nil { return errors.Wrap(
ErrDomain, err.Error(), ) }
if err := f(); err != nil { return errors.Wrap(
ErrDomain, err.Error(), ) }
Stack Trace ফ͑Δ͠ඇৗʹअѱ
Ͳ͏ʹ͔͍ͨ͠
࡞ͬͨ
github.com/nametake/labelerr github.com/nametake/suberr
github.com/ nametake/labelerr
Wrap(err error, label string) error Label(err error) string
Wrap(err error, label string) error Label(err error) string
Wrap(err error, label string) error Label(err error) string
Wrap(err error, label string) error Label(err error) string
Wrap(err error, label string) error Label(err error) string
Wrap(err error, label string) error Label(err error) string
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err)) third: second: warning: first: cause
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err)) warning
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err)) warning
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = labelerr.Wrap(err,
"warning") err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(labelerr.Label(err)) fmt.Println(errors.Cause(err)) cause
cause first wrap LABEL ERROR second wrap
cause first wrap LABEL ERROR second wrap
github.com/ nametake/suberr
Add(main error, sub error) error SubCause(err error) error
Add(main error, sub error) error SubCause(err error) error
Add(main error, sub error) error SubCause(err error) error
Add(main error, sub error) error SubCause(err error) error
Add(main error, sub error) error SubCause(err error) error
Add(main error, sub error) error SubCause(err error) error
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err)) third: second: sub: first: cause
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err)) sub
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err)) sub
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err))
err := errors.New("cause") err = errors.Wrap(err, "first") err = suberr.Add(err,
errors.New("sub")) err = errors.Wrap(err, "second") err = errors.Wrap(err, "third") fmt.Println(err) fmt.Println(suberr.SubCause(err)) fmt.Println(errors.Cause(err)) cause
cause first wrap second wrap third wrap
cause first wrap second wrap third wrap SUB ERROR
෦Ͱpkg/errorsΛ ͍ͬͯΔͷͰ Stack TraceΔ
ҾฦΓ Primitiveͳܕ͔͠ ͍ͬͯͳ͍
FBͬͯ·͢ʂ