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
【Go言語】エラーハンドリング
Search
Tomoki Ota
September 11, 2024
Programming
98
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【Go言語】エラーハンドリング
Goのエラーハンドリングについて解説しています。
Tomoki Ota
September 11, 2024
More Decks by Tomoki Ota
See All by Tomoki Ota
アーキテクチャの価値
tomo1227
0
130
アーキテクチャとビジネスロジック
tomo1227
0
130
【Go言語】テスト
tomo1227
0
96
【Go言語】クロージャ
tomo1227
0
340
【Go言語】イテレータ
tomo1227
0
120
AIに淘汰されないようにするには?
tomo1227
0
100
【Go言語】range
tomo1227
0
110
【Go言語】break
tomo1227
0
100
【Go言語】反復処理
tomo1227
0
80
Other Decks in Programming
See All in Programming
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
880
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
210
Built Our Own Background Agent at LayerX
layerx
PRO
9
5.2k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
250
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
560
What's New in Android 2026
veronikapj
0
260
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
670
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
320
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
110
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
300
Google Apps Script で Ruby を動かす
kawahara
0
150
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
210
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
We Are The Robots
honzajavorek
0
290
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
400
Embracing the Ebb and Flow
colly
88
5.1k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Un-Boring Meetings
codingconduct
0
380
Building Adaptive Systems
keathley
44
3.2k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Between Models and Reality
mayunak
4
390
Documentation Writing (for coders)
carmenintech
77
5.4k
Transcript
Tomoki Ota ʲGoݴޠʳ ΤϥʔϋϯυϦϯά
ύχοΫ Τϥʔ Τϥʔϥοϐϯά Τϥʔͷൺֱ(error.As(), error.Is()) ΤϥʔͷϥΠϒϥϦ μϒϧϋϯυϦϯά ͓·͚ ΞδΣϯμ 2
panic
Goʹ͓͚Δྫ֎ॲཧ 4 ྫ֎ : ҙਤ͠ͳ͍Τϥʔ → Ͱ͖Δ͚ͩগͳ͍ํ͕͍͍
Goʹ͓͚Δྫ֎ॲཧ 5 •errorܕΛฦ͢ˡਪ •panic/recoverΛར༻͢Δ
panic 6
recover 7
recover 8
panicͤ͞Δ͖ͱ͖ 9 •७ਮͳϓϩάϥϚʔΤϥʔ •ΞϓϦέʔγϣϯ͕ඞਢґଘؔΛඞཁͱ͢ΔʹؔΘΒͣ ॳظԽʹࣦഊ͢Δͱ͖
७ਮͳϓϩάϥϚʔΤϥʔ 10 net/httpύοέʔδͷWriteHeader εςʔλείʔυ͕༗ޮԽͲ͏͔Λݕࠪ͢ΔͨΊʹcheckWriteHeaderCode()ΛݺͿ
ΞϓϦέʔγϣϯ͕ඞਢͷґଘؔͷ࡞ʹࣦഊ͢Δͱ͖ 11 regexpύοέʔδʹɺจࣈྻ͔Βਖ਼نදݱΛ࡞͢Δؔͱͯ͠ɺҎԼͷ͕̎ͭ͋Δɻ •Compile : *regexp.RegexpͱΤϥʔΛฦ͢ •MustCompile : Τϥʔ͕ൃੜͨ͠ΒύχοΫΛൃੜͤ͞Δ
Τϥʔ
ΤϥʔϋϯυϦϯάͱʁ 13 ϓϩάϥϛϯάͰࣦഊ͕ى͜ΓಘΔؔΛݺͼग़͢ͱ ඞͣʮΤϥʔʯΛऔΓѻ͏ඞཁ͕͋Δɻ
ΤϥʔϋϯυϦϯάͱʁ 14 ى͖ͨΤϥʔʹରͯ͠ͲͷΑ͏ͳ࣮Λߦ͏͖͔ͷऔΓܾΊઃܭ
ΤϥʔϋϯυϦϯάͱʁ •ϑΝΠϧ͕ଘࡏ͠ͳ͍ •ΞΫηεݖݶ͕ͳ͍ •σΟεΫ͕յΕ͍ͯΔ •ׂΓࠐΈͷൃੜ •ڧ੍ऴྃ͢Δ •ϦτϥΠ͢Δ •৽͘͠ϑΝΠϧΛ࡞͢Δ •ϩάΛग़ྗ͢Δ •ݺͼग़͠ݩʹΒͤΔ
ϑΝΠϧΛ։࣌͘ͷ I/OΤϥʔ Τϥʔॲཧ
Τϥʔͱʁ 16
Τϥʔͱʁ 17 ϓϩάϥϜ : ਖ਼ৗ࣌ͱҟৗ࣌ͱ͍͏2ͭͷঢ়ଶΛ࣋ͭ Τϥʔ : ҟৗͱ͍͏ঢ়ଶΛϓϩάϥϚʔʹΒͤΔͨΊͷํ๏
ଟݴޠʹ͓͚ΔΤϥʔ 18 JavaRubyɺPythonͳͲ : ྫ֎͕ൃੜ͢Δɻ Cݴޠ : ͨͱ͑fopenΛ͏ͳΒΓ͕NULLͱͳΓɺ errnoʹΤϥʔͷཧ༝͕ઃఆ͞ΕΔ(C++ͳΒྫ֎͕ൃੜ)ɻ
ଟݴޠʹ͓͚ΔΤϥʔ 19 ର Τϥʔ௨ Cݴޠ intͷฦΓͱͯ͠ΤϥʔΛฦ͢ fopen, java.util.Map.get() ͳͲ ฦΓΛnullableͳܕʹͯ͠ɺΤϥʔ࣌ʹnullΛฦ͢
goݴޠͳͲ ฦΓΛΤϥʔͱͷλϓϧʹ͢Δ HaskellͷEitherܕͳͲ ฦΓΛΤϥʔͱͷܕʹ͢Δ STLͷstreamͳͲ ΦϒδΣΫτΛΤϥʔঢ়ଶʹ͢Δ JavaRubyɺPythonͳͲ ྫ֎Λ͛Δ
ଟݴޠʹ͓͚ΔΤϥʔ 20 ֤ϓϩάϥϛϯάݴޠͷΤϥʔॲཧͦΕͧΕҟͳΔ͕ɺ ڞ௨తͳجຊతͳػೳ͕ଘࡏ͢Δɻ • ΤϥʔॲཧϓϩάϥϜͷଓߦ·ͨதஅΛ੍ޚͰ͖Δ • Τϥʔൃੜͨ͠ΤϥʔΛ֦ு͠ใΛิ͢Δ͜ͱ͕Ͱ͖Δ • ϢʔβʔఆٛͷΤϥʔΛ࣮Ͱ͖Δ
GoͷΤϥʔϋϯυϦϯά 21
࠷γϯϓϧͳΤϥʔϋϯυϦϯά 22
Τϥʔܕ 23 ErrorܕError()Λ࣋ͭΠϯλʔϑΣΠε
Τϥʔܕ 24 Error()ͱ͍͏ৼΔ͍ΛຬͨͤErrorܕͱͳΔ
༨ஊ 25 Goͷඪ४ϥΠϒϥϦsyscallύοέʔδ͕ฦ͢errorܕɺ CݴޠͰΤϥʔΛѻ͏ͱ͖ʹొ͢ΔerrnoͱಉͰ͋ΓɺʢWindowsͷ߹GetLastError()ʣɺ ͦͷΤϥʔίʔυ͔ΒΤϥʔϝοηʔδΛಘΒΕΔErrorϝιουʢॲཧstrerrorɻWindowsͰ FormatMessageʣΛ࣮ͨ͠Errnoܕͱ࣮ͯ͠͞Ε͍ͯΔɻ
༨ஊ 26 Error͕ϑΟʔϧυͰͳ͘ϝιουͰ͋Δ͜ͱʹ͍ͭͯɺ Τϥʔϝοηʔδ͕ඞཁʹͳͬͨλΠϛϯά·Ͱ͜ͷจࣈྻԽʹ͔͔ΔίετΛ ݮͤ͞ΒΕΔͱ͍͏ͰΑ͘ઃܭ͞Ε͍ͯΔɻ
Τϥʔϥοϐϯά
Τϥʔͷϥοϓ
Τϥʔϥοϐϯάͱʁ 29 ΤϥʔϥοϐϯάΤϥʔΛϥοϓͯ͠ ݩͷΤϥʔར༻Ͱ͖ΔΑ͏ʹ͢Δ͜ͱ
Τϥʔϥοϐϯάͱʁ 30 ಛఆͷϢʔβ͔ΒσʔλϕʔεࢿݯͷΞΫηεཁٻΛड͚͕ͨɺΫΤϦத ʹʮύʔϛογϣϯ͕ڋ൱͞Ε·ͨ͠ʯͱ͍͏Τϥʔ͕ൃੜ͢Δͱ͖
Τϥʔϥοϐϯάͱʁ 31 ͜͜Ͱจ຺ใΛՃ͢ΔΘΓʹɺΤϥʔʹϚʔΫΛ͚͍ͭͨɻ ؔΛݺͼग़ͨ͠ͱ͖ʹड͚ͱͬͨͯ͢ͷΤϥʔ͕ForbiddenܕՔಇԽΛݕࠪ͢ ΔHTTPϋϯυϥΛ࣮ͯ͠ɺ403Λฦ͢Α͏ʹ͢Δɻ
Τϥʔϥοϐϯάͱʁ 32 ݺͼग़͠ͱɺΤϥʔΛΞϯϥοϓͯ͠ɺݩͷΤϥʔΛݕࠪ͢Δ͜ͱͰɺΤϥʔ Λॲཧ͢Δ͜ͱ͕Ͱ͖Δɻจ຺ใΛՃ্ͨ͠ͰɺϚʔΫ͚Λ͢Δͱ͍͏྆ํ ͷใΛሊԽ͍ͨ͠߹͋Δɻ
ϥοϓ͠ͳ͍ 33
ϥοϓ͠ͳ͍ 34
ಠࣗͷΤϥʔܕ(Go1.13Ҏલओྲྀ) 35
%w 36
%v 37 %v%wͱҧͬͯϥοϓ͞Ε͓ͯΒͣɺม͞Ε͍ͯΔ͚ͩɻ →ݺͼग़͠ݩ͋ΜϥοϓͰ͖ͳ͍ɻݩͷΤϥʔར༻Ͱ͖ͳ͘ͳΔɻ
%vΛ͍͚ͬͯͳ͍ͷ͔ʁ 38 %wΑΓ੍ݶ͞Ε͍ͯΔ͕ɺඞͣ͠%wΛͬͨ΄͏͕͍͍ͱݶΒͳ͍ɻ ΤϥʔΛϥοϓ͢Δͱɺݺͼग़͠ݩ͕ݩͷΤϥʔΛར༻Ͱ͖Δ͕ɺ ͦΕίʔυͷ݁߹ͱ͍͏જࡏతͳΛಋೖͯ͠͠·͏ɻ ΤϥʔϥοϐϯάΛͬͯݩͷΤϥʔ͕barΤϥʔ͔Ͳ͏͔ΛFooͷݺͼग़͠ݩ͕ݕࠪ͢Δ ߹Λߟ͑Δɻͦͷ্Ͱ࣮Λมߋͯ͠ɺผͷؔΛ͍ɺผͷछྨͷΤϥʔΛฦ͢Α͏ʹ͢Δ ͱɺݺͼग़͠ݩ͕ߦͳͬͨΤϥʔͷݕ͕ࠪػೳ͠ͳ͘ͳΔɻ ΫϥΠΞϯτ͕࣮ͷৄࡉͱߟ͑ΒΕΔͷʹґଘ͠ͳ͍Α͏ʹ͢Δʹɺฦ͞ΕΔΤϥʔ ϥοϓ͞ΕΔͷͰͳ͘ɺม͞ΕΔඞཁ͕͋Δɻ͜ͷΑ͏ͳ߹%wͰͳ͘ɺ%vΛ༻
͢Δͷ͕·͍͠ɻ
pureͳ࣮ 39
%w 40
%v 41
%v 42
Τϥʔϥοϐϯά·ͱΊ 43 ํ๏ Ճͷจ຺ใ ΤϥʔͷϚʔΫ͚ ݩͷΤϥʔ͕ར༻Մೳ ΤϥʔΛฦ͢ ❌ ❌ ⭕
ಠࣗͷΤϥʔܕ ⭕(Τϥʔܕ͕จࣈྻϑΟʔϧ υΛؚΜͰ͍ͨΒ) ⭕ ⭕(ݩͷΤϥʔ͕ެ։͞Ε͍ͯ ΔɺϝιουΛ௨ͯ͠ΞΫη εͰ͖ΔͳΒՄೳ) fmt.Errorfͱ%w ⭕ ❌ ⭕ fmt.Errorfͱ%v ⭕ ❌ ❌
ΤϥʔͷΞϯϥοϓ
Ξϯϥοϓ 45 Τϥʔܕ͕Unwrap()ͱ͍͏ৼΔ͍Λ͍࣋ͬͯΔͱ ݺͼग़͠ݩͰΞϯϥοϓ͢Δ͜ͱ͕Ͱ͖Δɻ Ξϯϥοϓ͢Δ͜ͱͰɺϥοϓ͞ΕͨࡍͷՃใΛऔΓআ͖ɺ ΤϥʔͷใΛऔಘͰ͖Δɻ
Ξϯϥοϓ 46 Ճใͷfoo failed:͕ग़ྗ͞Εͣ த͚ͩग़ྗ͞ΕΔɻ
ݺͼग़͠ݩ 47 ݺͼग़͠ݩʹerr͕FooErrorܕͰ͋Δ͜ͱΛ Βͳ͍ͷͰUnwrap()͕ଘࡏ͢Δ͜ͱΘ͔Βͳ͍
ܕΞαʔγϣϯ 48 iͷܕ͕TͰ͋Δ߹ɺ ok=true, tʹiͷΛΩϟετͯ͠ೖ i͕TͰͳ͍߹ɺok=false, tʹθϩΛೖ(okΛলུ͢ΔͱɺpanicʹͳΔ)
ܕΞαʔγϣϯ 49
Ξϯϥοϓ 50
Ξϯϥοϓ 51
Τϥʔͷൺֱ
errors.As()
54 ϥοϓ͞ΕͨΤϥʔ͕ಛఆͷܕ͔൱͔ݕࠪ͢Δ errors.As
errors.As 55 ΤϥʔΛ࠶ىతʹΞϯϥοϓ͠ɺ࿈ͨ͠Τϥʔ͕ظ͢ΔܕʹҰக͢Δ߹ʹtrueΛฦ͢ɻ
errors.As 56
errors.Is()
ηϯνωϧΤϥʔ 58 άϩʔόϧมͱͯ͠ఆٛ͞ΕͨΤϥʔ
ηϯνωϧΤϥʔ 59 ҰൠతʹɺErrXXXͱ໋໊͍ͬͨ͢Δɻ ηϯνωϧΤϥʔ༧ظ͞ΕΔΤϥʔΛ͑Δͷɻ
error.Is() 60
=Λ༻͍ͨͷൺֱ 61 fmt.Errorfͱ%wΛͬͯsql.ErrNoRowsΛϥοϓ͢Δͱ err == sql.ErrNoRows ৗʹfalseʹͳΔɻ
=Λ༻͍ͨͷൺֱ 62
ΤϥʔͷϥΠϒϥϦ
ΤϥʔͷϥΠϒϥϦ 64 cockroach/errors : ਪɻෳΤϥʔରԠɻελοΫτϨʔε͋ΓɻݱࡏҰ൪ओྲྀͱͳͬͯΔ pkg/errors : archiveͳͷͰඇਪ errors :
ඪ४ϥΠϒϥϦɻϥοϐϯάͳ͍ɻελοΫτϨʔεͳ͠ fmtͷErrof : ελοΫτϨʔεͳ͠ɻϰΝʔϒͰϥοϓ͢Δɻ%w, %v xerrors : ଟ͕͘Deprecatedʹͳ͍ͬͯΔͷͰඇਪ hashicorp/go-multierror : ෳΤϥʔΛѻ͏ͨΊͷϥΠϒϥϦ͕ͩɺඪ४ϥΠϒϥϦͰରԠ͞Εͨ morikuni/failure : Τϥʔίʔυϕʔεͷྫ֎ϋϯυϦϯά go-errors/errors : ෳΤϥʔʹରԠ͍ͯ͠Δ͕ɺػೳߋ৽සඍົͳͷͰඇਪ goark/errs : ελοΫτϨʔε͋Γɻߋ৽සඍົ
ͲͷϥΠϒϥϦ͕͍͍ͷ͔ 65 • ελοΫτϨʔε͕ඞཁͳ߹ : cockroach/errors • ελοΫτϨʔεΛΘͳ͍ͱ͖ : errors
& fmt.Errof ͨͩ͠ɺελοΫτϨʔε͋Γͩͱ݁ߏύϑΥʔϚϯε͕མͪΔ
cockroach/errors 66
pkg/errors 67
μϒϧϋϯυϦϯά
69 Τϥʔϝοηʔδ͕ ϩάͷهͱฦ͞ΕΔΤϥʔͷ྆ํͰ܁Γฦ͞Ε͍ͯΔ ←Ңͷ͕ແޮͷͱ͖
70 Ͳͷݺͼग़͕ࣦ͠ഊͨ͠ͷ͔ͱ͍͏ใ͕ ࣦΘΕ͍ͯΔ
71
Τϥʔͷແࢹ
Τϥʔͷແࢹ 73 ҙਤతʹΤϥʔϋϯυϦϯάΛল͍͍ͯΔ
Τϥʔͷແࢹ 74 ແࢹ͢Δ߹্هͷํ๏Ұɻίϝϯτ
͓·͚