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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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.26?
ciarana
2
430
What's new in Go 1.25?
ciarana
1
110
What's new in Go 1.24?
ciarana
1
270
What's new in Go 1.21?
ciarana
2
1.7k
PGOによるコンパイラ最適化 / Compiler Optimization with PGO
ciarana
2
1k
Other Decks in Programming
See All in Programming
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
360
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
270
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
790
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
160
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
11
5.8k
net-httpのHTTP/2対応について
naruse
0
500
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
140
dRuby over BLE
makicamel
2
380
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
11
4.3k
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
300
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
360
Become a Pro
speakerdeck
PRO
31
6k
Visualization
eitanlees
152
17k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
850
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
Scaling GitHub
holman
464
140k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Optimizing for Happiness
mojombo
378
71k
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!