Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
ShunsukeNakamura17
399 views
Rust Error Handling
第5回社内Rust勉強会MoT.rsの発表資料です RustのResult型 / ? pattern / anyhow / thiserror について話しました
Engineering
◦
Read more
0
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 27
2
/ 27
3
/ 27
4
/ 27
5
/ 27
6
/ 27
7
/ 27
8
/ 27
9
/ 27
10
/ 27
11
/ 27
12
/ 27
13
/ 27
14
/ 27
15
/ 27
16
/ 27
17
/ 27
18
/ 27
19
/ 27
20
/ 27
21
/ 27
22
/ 27
23
/ 27
24
/ 27
25
/ 27
26
/ 27
27
/ 27
More Related Content
PDF
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
by
Takuto Wada
PDF
プログラムを高速化する話
by
京大 マイコンクラブ
PDF
例外設計における大罪
by
Takuto Wada
PPTX
C# 8.0 非同期ストリーム
by
信之 岩永
PDF
chatGPTの驚くべき対話能力.pdf
by
YamashitaKatsushi
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
PDF
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
by
増田 亨
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
by
Takuto Wada
プログラムを高速化する話
by
京大 マイコンクラブ
例外設計における大罪
by
Takuto Wada
C# 8.0 非同期ストリーム
by
信之 岩永
chatGPTの驚くべき対話能力.pdf
by
YamashitaKatsushi
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
by
増田 亨
What's hot
PDF
モダンフロントエンド開発者に求められるスキルとは
by
Takuya Tejima
PPT
Glibc malloc internal
by
Motohiro KOSAKI
PDF
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
PDF
Pythonによる黒魔術入門
by
大樹 小倉
PDF
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
PDF
Rustに触れて私のPythonはどう変わったか
by
ShunsukeNakamura17
PDF
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
PDF
機械学習モデルのサービングとは?
by
Sho Tanaka
PDF
GoによるWebアプリ開発のキホン
by
Akihiko Horiuchi
PDF
デキるプログラマだけが知っているコードレビュー7つの秘訣
by
Masahiro Nishimi
PDF
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
PPTX
CyberChefの使い方(HamaCTF2019 WriteUp編)
by
Shota Shinogi
PDF
不遇の標準ライブラリ - valarray
by
Ryosuke839
PDF
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
PPTX
Docker超入門
by
VirtualTech Japan Inc.
PDF
できる!並列・並行プログラミング
by
Preferred Networks
PDF
ドキュメントを作りたくなってしまう魔法のツールSphinx
by
Takayuki Shimizukawa
PDF
Oss貢献超入門
by
Michihito Shigemura
PDF
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
モダンフロントエンド開発者に求められるスキルとは
by
Takuya Tejima
Glibc malloc internal
by
Motohiro KOSAKI
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
Pythonによる黒魔術入門
by
大樹 小倉
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
Rustに触れて私のPythonはどう変わったか
by
ShunsukeNakamura17
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
機械学習モデルのサービングとは?
by
Sho Tanaka
GoによるWebアプリ開発のキホン
by
Akihiko Horiuchi
デキるプログラマだけが知っているコードレビュー7つの秘訣
by
Masahiro Nishimi
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
CyberChefの使い方(HamaCTF2019 WriteUp編)
by
Shota Shinogi
不遇の標準ライブラリ - valarray
by
Ryosuke839
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
Docker超入門
by
VirtualTech Japan Inc.
できる!並列・並行プログラミング
by
Preferred Networks
ドキュメントを作りたくなってしまう魔法のツールSphinx
by
Takayuki Shimizukawa
Oss貢献超入門
by
Michihito Shigemura
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
Similar to Rust Error Handling
PPTX
Rustの最初の難関を超えるための第一の技
by
Masuda Tomoaki
PDF
Ruby初級者向けレッスン 45回 ─── 例外
by
higaki
PDF
Rust samurai#01
by
Noritada Shimizu
PDF
Rust 超入門
by
Chris Birchall
PDF
続・ゲンバのSwift
by
Yuichi Adachi
PDF
Swift 2.0 の Error Handling #yhios
by
Tomohiro Kumagai
PDF
初級者向けレッスン 51回 ─── 例外
by
higaki
PDF
Scalaでの例外処理
by
Takashi Kawachi
PDF
Rubyのエラーをちょっと整理(初級者向け)
by
universato
PDF
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
by
ShunsukeNakamura17
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
by
digitalghost
PDF
例外処理について.pdf
by
KoudaiKumazaki
PDF
ラボユース 最終成果報告会
by
shiftky
KEY
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
by
sn_monochr
Rustの最初の難関を超えるための第一の技
by
Masuda Tomoaki
Ruby初級者向けレッスン 45回 ─── 例外
by
higaki
Rust samurai#01
by
Noritada Shimizu
Rust 超入門
by
Chris Birchall
続・ゲンバのSwift
by
Yuichi Adachi
Swift 2.0 の Error Handling #yhios
by
Tomohiro Kumagai
初級者向けレッスン 51回 ─── 例外
by
higaki
Scalaでの例外処理
by
Takashi Kawachi
Rubyのエラーをちょっと整理(初級者向け)
by
universato
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
by
ShunsukeNakamura17
C++コンパイラ GCCとClangからのメッセージをお読みください
by
digitalghost
例外処理について.pdf
by
KoudaiKumazaki
ラボユース 最終成果報告会
by
shiftky
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
by
sn_monochr
Rust Error Handling
1.
Mobility Technologies Co.,
Ltd. Rust Error Handling 2021/04/28 @MoT.rs Shunsuke Nakamura AI技術開発部
2.
Mobility Technologies Co.,
Ltd. 今日やること 2 - Rustのエラー表現 - エラーによるフロー制御 - よくあるエラー処理 - エラー時の早期リターン - ライブラリを使用したエラー処理のベストプラクティス
3.
Mobility Technologies Co.,
Ltd. Rustのエラー表現 3 ■ Rust には Java や Python のような例外はなく、Result型でエラーを表現する ■ Result型は Result<{Ok の時の中身の型}, {Errの時の中身の型}> で定義する ■ 実体はただのEnum型
4.
Mobility Technologies Co.,
Ltd. 問題1 4 Rust playground にかかれているコードのコンパイルエラーを解消してください
5.
Mobility Technologies Co.,
Ltd. 解説1 5 Okの際には i32 を、Err の際には ZeroDivisionError を返しているため、 ここでは Result<i32, ZeroDivisionError> を返せば良い
6.
Mobility Technologies Co.,
Ltd. エラーによるフロー制御 6 Result型に対して、OkとErrで処理を分けたい場合 Result型はenumなので簡単なパターンマッチングで処理を分岐させられる ※ enumのVariantによるフロー制御
7.
Mobility Technologies Co.,
Ltd. 問題2 7 Rust playground にかかれているコードのコンパイルエラーを解消してください ヒント 1. Result<T, E>はOk<T>とErr<E>のenum型です 2. enum & パターンマッチによるフロー制御はスライドの前ページを参照してください
8.
Mobility Technologies Co.,
Ltd. 解説2 8 Okの際は改めて中身を val として受けて表示し、 Errのときは _ で受けてエラーメッセージを出しています(eprintln! 等を使うとなお良い) _ で受けると「この変数は使用しない」ということを意味します 参考
9.
Mobility Technologies Co.,
Ltd. よくあるエラー処理 9 ■ 毎回パターンマッチを書くのは面倒。よくある処理はより短いメソッドを用意してくれている ■ unwrap: Okなら中身の値を取り出し、Errなら終了する。頻出 ■ 問題点として、Errだと本当にpanic終了してしまうので、そこでコードが落ちる。 ■ 本当に落として良いところでしか使ってはいけない ■ expect: Okなら中身の値を取り出し、Errならメッセージを付けて終了する ■ 問題点として、Errだと本当にpanic終了してしまうので、そこでコードが落ちる。 ■ 本当に落として良いところでしか使ってはいけない ■ and_then: Okなら後段の処理を継続し、ErrならErrを伝播させていく ■ 例外処理を上段に任せて正常ケースだけ処理を進めていく時に便利
10.
Mobility Technologies Co.,
Ltd. 問題3 10 Rust playground にかかれているコードのコンパイルエラーを解消してください ヒント Result型に用意されているメソッド一覧です https://doc.rust-lang.org/std/result/enum.Result.html
11.
Mobility Technologies Co.,
Ltd. 解説3 11 答え unwrap, expect, and_then をそれぞれで使います and_thenの中では次に実行するfunctionを渡してあげる必要があるので、 closure形式で渡しています
12.
Mobility Technologies Co.,
Ltd. 早期リターンと?演算子 12 メソッドの中で使用している値がOkなら値を取り出して、Errなら早期returnする、というコードをよく書くこと がある 下のようにパターンマッチを書いてもいいが、毎回これを書くのは面倒なので、 syntax sugarとして、?演算子が用意されている
13.
Mobility Technologies Co.,
Ltd. 問題4 13 Rust playground にかかれているコードのコンパイルエラーを解消してください
14.
Mobility Technologies Co.,
Ltd. 解説4 14 ? を使って Err 時に早期 returnさせます。 もちろん match を使って早期 return させてもいいですが、? のほうが短く済むし、見やすいです
15.
Mobility Technologies Co.,
Ltd. 複数のErrorを扱う 15 文字列 a, b を受け取って、i32型としてパースした後に割り算を行う関数を書いたとする これは以下のコンパイルエラーとなる。
16.
Mobility Technologies Co.,
Ltd. より正確な?演算子 16 ?演算子は受け取ったErr<E1>と、returnすべきErr<E2>が異なる時(E1 != E2のとき)、 型通りにreturnできるよう、E1をE2に型変換しようとしてくれる(同じ時は同じ型に変換する) RustでのA → Bへの変換は、Bに対してFrom<A> trait が実装されていれば - let a: A = From::from(B); - let a = A::from(B); のように行うことができる つまり、?演算子はより正確には↓となる
17.
Mobility Technologies Co.,
Ltd. 複数のErrorを扱う 17 文字列 a, b を受け取って、i32型としてパースした後に割り算を行う関数を書いたとする これは以下のコンパイルエラーとなる。 ParseIntError -> &str への変換が実装されていない!
18.
Mobility Technologies Co.,
Ltd. 問題5 18 Rust playground From traitを実装してください
19.
Mobility Technologies Co.,
Ltd. 解説5 19 答え From traitの実装はこのドキュメントに詳しいです。 impl From<変換元> for 変換先 … という実装をしておくと、 変換先::from(変換元) ができるようになります 余談ですが、この実装をすると自動で Into<変換先> for 変換元 が実装されるので、 let a: 変換先 = 変換元.into() が実行できるようになります
20.
Mobility Technologies Co.,
Ltd. 問題6 20 Rust playground From traitを実装して早期returnしてください
21.
Mobility Technologies Co.,
Ltd. 解説6 21 答え 先程と同様にFrom traitを実装します これのおかげで、早期returnの?演算子がFrom::from変換を呼び出すことができます
22.
Mobility Technologies Co.,
Ltd. 複数のErrorを扱う 22 一つの関数から複数のエラー(Err<E1>, Err<E2>, ...)が返る可能性がある、ということはよくある 対策としては、 - MyErrorのようなenumを定義し、全てのE1, E1→ MyError への変換(From)を実装する - 自分で定義したエラー型に、毎回変換を実装ていくのは面倒 - Result<T, Box<dyn Error>> を返す関数である、と定義する - Box<dyn Error> は Error traitを実装した任意の型、を意味する - 自分で定義したエラー型に、毎回Error traitを実装していくのは面倒 → 最近の主流: Error周りをよしなにやってくれる便利ライブラリを使う - anyhow: アプリケーション用と言われている - thiserror: ライブラリ用と言われている
23.
Mobility Technologies Co.,
Ltd. anyhow 23 アプリケーション用Errorライブラリ - anyhow::Errorの提供 - Box<dyn Error> のようなものになっており、 std::error::Errorを実装しているものなら何でも渡せる - Err(anyhow::anyhow!(“”)) だけで anyhow::Errorを生成してくれる - anyhow::Resultを提供 - anyhow::Result<T> だけで Result<T, anyhow::Error> と同じ意味になる - anyhow::Contextの提供 - 既存のErrorにメッセージを足すことができる
24.
Mobility Technologies Co.,
Ltd. thiserror 24 ライブラリ用Errorライブラリ - thiserror::Errorの提供 - 独自で定義したstructやenumに対して thiserror::Errorをderiveさせるだけで、 std::error::Errorを実装させることができる - anyhowと組み合わせることで かなりコード量を削ることができる
25.
Mobility Technologies Co.,
Ltd. 問題7 25 Rust playground anyhow / thiserrorを使ってコードを修正してください
26.
Mobility Technologies Co.,
Ltd. 解説8 26 まずは、std::error::Errorを実装した任意の型を返せるように変更する 途中経過1 しかしこれは残念ながらコンパイルエラーになる。理由は自分で定義したMyErrorがstd::error::Errorを実 装していないから(このstructはDebugしか実装していない) 自分でstd::error::Errorを実装するのは面倒なので、thiserrorを呼び出し、deriveさせるだけで実装したこ とにしてしまう 途中経過2 最後に、Result<i32, Box<dyn std::error::Error>> がやや長ったらしいので、これを略記できる anyhowを使って完成 答え
27.
Mobility Technologies Co.,
Ltd. 参考ページ 27 ■ Rust公式docs Error Handling ■ Rust by example Error Handling ■ Rustlings Error Handling ■ thiserror / anyhow の導入の流れ: Rust エラー処理2020
Download