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
96
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
94
【Go言語】クロージャ
tomo1227
0
340
【Go言語】イテレータ
tomo1227
0
120
AIに淘汰されないようにするには?
tomo1227
0
97
【Go言語】range
tomo1227
0
110
【Go言語】break
tomo1227
0
98
【Go言語】反復処理
tomo1227
0
76
Other Decks in Programming
See All in Programming
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
130
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
120
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
290
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
150
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
200
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
250
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
440
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
150
メールのエイリアス機能を履き違えない
isshinfunada
0
150
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
440
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
3.2k
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
180
Featured
See All Featured
Accessibility Awareness
sabderemane
1
160
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
430
How to Talk to Developers About Accessibility
jct
2
450
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
610
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
390
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Facilitating Awesome Meetings
lara
57
7k
Abbi's Birthday
coloredviolet
3
8.9k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
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 ແࢹ͢Δ߹্هͷํ๏Ұɻίϝϯτ
͓·͚