Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
890
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
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
400
スタートアップで1人目QAエンジニアになった話 / Startup first QA
nametake
3
1.4k
テスト技法の話 / Testing techniques
nametake
5
4.9k
Other Decks in Technology
See All in Technology
MySQLとPostgreSQLのコレーション / Collation of MySQL and PostgreSQL
tmtms
1
1.2k
「図面」から「法則」へ 〜メタ視点で読み解く現代のソフトウェアアーキテクチャ〜
scova0731
0
490
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
400
LayerX QA Night#1
koyaman2
0
250
オープンソースKeycloakのMCP認可サーバの仕様の対応状況 / 20251219 OpenID BizDay #18 LT Keycloak
oidfj
0
160
シニアソフトウェアエンジニアになるためには
kworkdev
PRO
3
270
TED_modeki_共創ラボ_20251203.pdf
iotcomjpadmin
0
140
ソフトウェアエンジニアとAIエンジニアの役割分担についてのある事例
kworkdev
PRO
0
210
AgentCore BrowserとClaude Codeスキルを活用した 『初手AI』を実現する業務自動化AIエージェント基盤
ruzia
7
1.4k
Connection-based OAuthから学ぶOAuth for AI Agents
flatt_security
0
350
ActiveJobUpdates
igaiga
1
310
AWSの新機能をフル活用した「re:Inventエージェント」開発秘話
minorun365
2
440
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
The Cost Of JavaScript in 2023
addyosmani
55
9.4k
Tell your own story through comics
letsgokoyo
0
760
Discover your Explorer Soul
emna__ayadi
2
1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
286
14k
The agentic SEO stack - context over prompts
schlessera
0
560
It's Worth the Effort
3n
187
29k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.3k
First, design no harm
axbom
PRO
1
1.1k
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ͬͯ·͢ʂ