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
7k
1人目QAエンジニアよもやま話 / QA Test Talk Vol.1
nametake
4
730
アルプでのAgile Testing / Alp Agile Testing
nametake
1
2.5k
CFD-Editorというツールを作ってみた話 / Made CFD-Editor
nametake
1
390
スタートアップで1人目QAエンジニアになった話 / Startup first QA
nametake
3
1.4k
テスト技法の話 / Testing techniques
nametake
5
4.9k
Other Decks in Technology
See All in Technology
まだ間に合う! Agentic AI on AWSの現在地をやさしく一挙おさらい
minorun365
10
420
コンテキスト情報を活用し個社最適化されたAI Agentを実現する4つのポイント
kworkdev
PRO
1
1.6k
生成AI活用の型ハンズオン〜顧客課題起点で設計する7つのステップ
yushin_n
0
240
チーリンについて
hirotomotaguchi
6
2.1k
エンジニアとPMのドメイン知識の溝をなくす、 AIネイティブな開発プロセス
applism118
5
1.4k
初めてのDatabricks AI/BI Genie
taka_aki
0
200
30分であなたをOmniのファンにしてみせます~分析画面のクリック操作をそのままコード化できるAI-ReadyなBIツール~
sagara
0
180
AI駆動開発の実践とその未来
eltociear
1
210
2025-12-18_AI駆動開発推進プロジェクト運営について / AIDD-Promotion project management
yayoi_dd
0
110
MLflowダイエット大作戦
lycorptech_jp
PRO
1
140
GitHub Copilotを使いこなす 実例に学ぶAIコーディング活用術
74th
3
3.4k
ディメンショナルモデリングを支えるData Vaultについて
10xinc
1
110
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
54k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
The Cult of Friendly URLs
andyhume
79
6.7k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Designing Experiences People Love
moore
143
24k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Automating Front-end Workflow
addyosmani
1371
200k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
286
14k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Side Projects
sachag
455
43k
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ͬͯ·͢ʂ