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
910
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
750
アルプでのAgile Testing / Alp Agile Testing
nametake
1
2.5k
CFD-Editorというツールを作ってみた話 / Made CFD-Editor
nametake
1
420
スタートアップで1人目QAエンジニアになった話 / Startup first QA
nametake
3
1.5k
テスト技法の話 / Testing techniques
nametake
5
4.9k
Other Decks in Technology
See All in Technology
"共通化"と"Embed"のブレンドでスケール可能な運用を!M&Aを支えるGENDA SREの実践 / GENDA Tech Talk #3
genda
0
230
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
10
74k
AIエージェントに必要なのはデータではなく文脈だった/ai-agent-context-graph-mybest
jonnojun
1
670
「技術的にできません」を越えて価値を生み出せ──研究開発チームをPMが率いて生み出した価値創出
hiro93n
1
190
#23 Turing × atmaCup 2nd 6th Place Solution + 取り組み方紹介
yumizu
0
150
AgentCore RuntimeをVPCにデプロイして 開発ドキュメント作成AIエージェントを作った
alchemy1115
3
250
30分でわかる「ネットワーク図の描き方入門」/infraengbooks56
corestate55
1
350
衛星画像即時マッピングサービスの実現に向けて
lehupa
1
290
React 19時代のコンポーネント設計ベストプラクティス
uhyo
17
6.1k
量子クラウドシステムと運用
oqtopus
0
180
新規事業開発でのAWS活用
amixedcolor
1
180
今、求められるデータエンジニア
waiwai2111
2
1.2k
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.7k
The World Runs on Bad Software
bkeepers
PRO
72
12k
What does AI have to do with Human Rights?
axbom
PRO
0
2k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
370
The Language of Interfaces
destraynor
162
26k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
100
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
320
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
130
Deep Space Network (abreviated)
tonyrice
0
74
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.7k
A designer walks into a library…
pauljervisheath
210
24k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
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ͬͯ·͢ʂ