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
nametake
December 18, 2018
Technology
1
880
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.4k
アルプ T-QAオンボーディング資料(2022年9月版) / Alp T-QA onboarding 2022-09
nametake
0
1.6k
定式化と自動化に取り組みますという話 / Work on formulation and automation
nametake
0
1k
QAエンジニアが実例マッピングを2ヶ月運用した話 / Example Mapping for 2 months
nametake
3
6.9k
1人目QAエンジニアよもやま話 / QA Test Talk Vol.1
nametake
4
720
アルプでのAgile Testing / Alp Agile Testing
nametake
1
2.4k
CFD-Editorというツールを作ってみた話 / Made CFD-Editor
nametake
1
380
スタートアップで1人目QAエンジニアになった話 / Startup first QA
nametake
3
1.4k
テスト技法の話 / Testing techniques
nametake
5
4.8k
Other Decks in Technology
See All in Technology
DSPy入門
tomehirata
6
740
SOTA競争から人間を超える画像認識へ
shinya7y
0
650
20251027_マルチエージェントとは
almondo_event
1
500
OTEPsで知るOpenTelemetryの未来 / Observability Conference Tokyo 2025
arthur1
0
350
re:Inventに行くまでにやっておきたいこと
nagisa53
0
820
ヘンリー会社紹介資料(エンジニア向け) / company deck for engineer
henryofficial
0
430
オブザーバビリティと育てた ID管理・認証認可基盤の歩み / The Journey of an ID Management, Authentication, and Authorization Platform Nurtured with Observability
kaminashi
2
1.5k
デザインとエンジニアリングの架け橋を目指す OPTiMのデザインシステム「nucleus」の軌跡と広げ方
optim
0
130
データとAIで明らかになる、私たちの課題 ~Snowflake MCP,Salesforce MCPに触れて~ / Data and AI Insights
kaonavi
0
190
Zero Trust DNS でより安全なインターネット アクセス
murachiakira
0
130
設計に疎いエンジニアでも始めやすいアーキテクチャドキュメント
phaya72
18
12k
進化する大規模言語モデル評価: Swallowプロジェクトにおける実践と知見
chokkan
PRO
2
370
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
6.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
2.9k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Leading Effective Engineering Teams in the AI Era
addyosmani
7
670
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
[RailsConf 2023] Rails as a piece of cake
palkan
57
6k
jQuery: Nuts, Bolts and Bling
dougneiner
65
7.9k
Product Roadmaps are Hard
iamctodd
PRO
55
11k
Building a Scalable Design System with Sketch
lauravandoore
463
33k
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ͬͯ·͢ʂ