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.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
dRuby over BLE
makicamel
2
380
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
net-httpのHTTP/2対応について
naruse
0
490
Vite+ Unified Toolchain for the Web
naokihaba
0
320
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
780
AI 輔助遺留系統現代化的經驗分享
jame2408
1
270
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
650
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.4k
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
540
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
GraphQLとの向き合い方2022年版
quramy
50
15k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Building AI with AI
inesmontani
PRO
1
1.1k
KATA
mclloyd
PRO
35
15k
Automating Front-end Workflow
addyosmani
1370
210k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
610
Discover your Explorer Soul
emna__ayadi
2
1.1k
Chasing Engaging Ingredients in Design
codingconduct
0
220
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
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!