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
93
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
120
アーキテクチャとビジネスロジック
tomo1227
0
120
【Go言語】テスト
tomo1227
0
92
【Go言語】クロージャ
tomo1227
0
330
【Go言語】イテレータ
tomo1227
0
110
AIに淘汰されないようにするには?
tomo1227
0
95
【Go言語】range
tomo1227
0
100
【Go言語】break
tomo1227
0
95
【Go言語】反復処理
tomo1227
0
74
Other Decks in Programming
See All in Programming
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
3
380
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
120
Contextとはなにか
chiroruxx
1
390
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.6k
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
290
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
960
Oxcを導入して開発体験が向上した話
yug1224
4
370
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
110
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
8.4k
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
150
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.6k
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
230
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
350
Ethics towards AI in product and experience design
skipperchong
2
320
Fireside Chat
paigeccino
42
4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
How STYLIGHT went responsive
nonsquared
100
6.2k
Balancing Empowerment & Direction
lara
6
1.2k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
550
A Modern Web Designer's Workflow
chriscoyier
698
190k
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 ແࢹ͢Δ߹্هͷํ๏Ұɻίϝϯτ
͓·͚