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
Go1.13以後のエラーハンドリングについて語ろう / Let's talk about ...
Search
Koya IWAMURA
October 28, 2019
Programming
8.8k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Go1.13以後のエラーハンドリングについて語ろう / Let's talk about error handling after Go 1 13
Koya IWAMURA
October 28, 2019
More Decks by Koya IWAMURA
See All by Koya IWAMURA
What's new in Go 1.27?
ciarana
0
460
What's new in Go 1.26?
ciarana
2
480
What's new in Go 1.25?
ciarana
1
120
What's new in Go 1.24?
ciarana
1
290
What's new in Go 1.21?
ciarana
2
1.8k
PGOによるコンパイラ最適化 / Compiler Optimization with PGO
ciarana
2
1.1k
Other Decks in Programming
See All in Programming
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
180
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
150
プロポーザルを書いてもらう
pvcresin
0
580
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
2
1.2k
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
500
MySQLとPostgreSQLって何が違うの?
akagami
0
140
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
150
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
360
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
130
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
270
Featured
See All Featured
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
470
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
430
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
How to make the Groovebox
asonas
2
2.3k
Amusing Abliteration
ianozsvald
1
260
First, design no harm
axbom
PRO
2
1.3k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
360
Speed Design
sergeychernyshev
33
2k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Transcript
Go1.13 以後の エラーハンドリング について語ろう Go Conference 2019 Autumn, Oct 28
2019 Koya IWAMURA CyberAgent, Inc. @cia_rana
Go1.13 からスタックトレースをとるための機能が追加 • fmt.Errorf (%w) • errors.Is • errors.As •
errors.Unwrap
fmt.Errorf (%w) • 既存のエラーをラッピング • 情報を付加 func MyFunc() error {
err := f() return fmt.Errorf(“MyFunc: %w”, err) }
errors.Is • 値の比較 if err == sql.ErrNoRows { fmt.Println(err) }
if errors.Is(err, sql.ErrNoRows) { fmt.Println(err) } Go1.13〜
errors.As • 型の比較(assertion, switch)、キャプチャ if e, ok := err.(*url.Error); ok
{ fmt.Printf(“isTimeout: %v”, e.Timeout()) } var e *url.Error if errors.As(err, &e) { fmt.Printf(“isTimeout: %v”, e.Timeout()) } Go1.13〜
Go1.13以後 エラーハンドリングする上での留意点
01 `if err != nil` が 無力化される Go1.13以後 エラーハンドリングする上での留意点
`if err != nil` が無力化される func f() ([]byte, error) {
resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } return ioutil.ReadAll(resp.Body) } func main() { a, err := f() if err != nil { fmt.Println(err) } fmt.Println(string(a)) }
`if err != nil` が無力化される func f() ([]byte, error) {
resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } a, err := ioutil.ReadAll(resp.Body) return a, fmt.Errorf(“%w”, err) } func main() { a, err := f() if err != nil { fmt.Println(err) } fmt.Println(string(a)) }
`if err != nil` が無力化される func f() ([]byte, error) {
resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } a, err := ioutil.ReadAll(resp.Body) return a, fmt.Errorf(“%w”, err) } func main() { a, err := f() if err != nil { fmt.Println(err) } fmt.Println(string(a)) } errがnilでも・・・
`if err != nil` が無力化される func f() ([]byte, error) {
resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } a, err := ioutil.ReadAll(resp.Body) return a, fmt.Errorf(“%w”, err) } func main() { a, err := f() if err != nil { fmt.Println(err) } fmt.Println(string(a)) } errがnilでも・・・ if文の中が走っちゃう
`if err != nil` が無力化される func f() ([]byte, error) {
resp, err := http.Get("cyberagent.ai") if err != nil { return nil, err } a, err := ioutil.ReadAll(resp.Body) return a, fmt.Errorf(“%w”, err) } func main() { a, err := f() if errors.Is(err, nil) { fmt.Println(err) } fmt.Println(string(a)) } errors.Isを使おう!
02 xerrorsと同じ挙動に 見せかけて実は違う Go1.13以後 エラーハンドリングする上での留意点
xerrorsと同じ挙動に見せかけて実は違う https://github.com/golang/go/wiki/ErrorValueFAQ
xerrorsと同じ挙動に見せかけて実は違う xerrors.Errorfでは ラップした位置に関する情報をとれる
xerrorsと同じ挙動に見せかけて実は違う fmt.Errorf では ラップした位置に関する情報をとれない
xerrorsと同じ挙動に見せかけて実は違う xerrors.Errorf で error をラップするには フォーマット指示子を ”: %w” にして 末尾に持ってこなくてはならない
xerrors.Errorf(“MyError: %w”, err)
xerrorsと同じ挙動に見せかけて実は違う fmt.Errorf で error をラップするには フォーマット指示子が ”%w” でありさえすれば良い fmt.Errorf(“MyError: %w
in main.main”, err)
Thank you for listening!