Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【Go言語】エラーハンドリング
Search
Tomoki Ota
September 11, 2024
Programming
110
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
140
アーキテクチャとビジネスロジック
tomo1227
0
140
【Go言語】テスト
tomo1227
0
110
【Go言語】クロージャ
tomo1227
0
370
【Go言語】イテレータ
tomo1227
0
130
AIに淘汰されないようにするには?
tomo1227
0
110
【Go言語】range
tomo1227
0
120
【Go言語】break
tomo1227
0
120
【Go言語】反復処理
tomo1227
0
92
Other Decks in Programming
See All in Programming
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
670
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
300
ActionController meets Protocol Buffers
sorah
1
770
Modernizing iOS Apps
seyfoyun
0
140
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
220
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
210
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
130
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
240
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
200
[2026-10-09]一枚の布で作らなくてもいい。 信頼性は「パッチワーク」で紡がれる~既存の運用と新しい可能性をつなぎ合わせてきたCREの話~
tosite
0
130
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
1.2k
sbt 2.0: takeoff
eed3si9n
0
180
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
310
Game over? The fight for quality and originality in the time of robots
wayneb77
1
320
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
480
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
550
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
The Invisible Side of Design
smashingmag
301
52k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
660
A Soul's Torment
seathinner
8
3.9k
Unsuck your backbone
ammeep
672
58k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
650
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 ແࢹ͢Δ߹্هͷํ๏Ұɻίϝϯτ
͓·͚