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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
440
What's new in Go 1.25?
ciarana
1
110
What's new in Go 1.24?
ciarana
1
280
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
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
310
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.8k
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
140
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
14
6.8k
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
200
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
120
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
510
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
110
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.4k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
190
Featured
See All Featured
A better future with KSS
kneath
240
18k
The Language of Interfaces
destraynor
162
27k
Between Models and Reality
mayunak
4
370
The Cult of Friendly URLs
andyhume
79
6.9k
Prompt Engineering for Job Search
mfonobong
0
370
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
690
How to build a perfect <img>
jonoalderson
1
5.8k
エンジニアに許された特別な時間の終わり
watany
107
250k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
290
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
260
Art, The Web, and Tiny UX
lynnandtonic
304
22k
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!