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
100
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
100
【Go言語】クロージャ
tomo1227
0
350
【Go言語】イテレータ
tomo1227
0
120
AIに淘汰されないようにするには?
tomo1227
0
110
【Go言語】range
tomo1227
0
110
【Go言語】break
tomo1227
0
110
【Go言語】反復処理
tomo1227
0
88
Other Decks in Programming
See All in Programming
Are APIs Still Relevant in the AI Era?
soyuka
0
310
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
190
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
210
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
250
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
360
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.8k
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
150
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
670
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
520
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
390
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
540
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
How to make the Groovebox
asonas
2
2.5k
sira's awesome portfolio website redesign presentation
elsirapls
0
420
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
550
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
370
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
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 ແࢹ͢Δ߹্هͷํ๏Ұɻίϝϯτ
͓·͚