🦀
The Rust Programing Language 7日目
前回のあらすじ
ベクタや文字列、HashMapなどについて学ぶ
ベクタ、リストよりかっこいいね
本日は9章 エラー処理
ここに来て1日開いてしまったが、別に毎日やるなんて言ってないのでOK
なるべく毎日やりたいが、志は低くする方が折れて辞めにくいというのは歴史が証明している
本日の学び
Rustのエラー
- Rustには例外が無い
- 回復可能なエラーには
Result<T, E>
値がある - 回復不能なエラーに到達した際には実行を中止する
panic!
マクロがある
- 回復可能なエラーには
- パニックが起きた際、通常プログラムは巻き戻しを行う
- 関数を片付けるなどやることは多い
-
Cargo.toml
の[profile]
欄にpanic = 'abort'
を指定することで、即座に終了させることができる- 実行可能ファイルが小さくなる
-
RUST_BACKTRACE
環境変数を0以外の値にすることでトレースを出力できる
Result
- 処理を以上終了させるほどではないエラーは回復可能なエラー
- 関数の戻り値では無さそうな型注釈を書くことで、実際の戻り値の型を知るTips
-
let f: u32 = File::open("hello.txt");
-
File::open
はResult<std::fs::File, std::io::Error>
を返すことがわかる
-
-
-
Result
を受け取り、match
で結果に応じた処理を行う-
Result
は初期化処理でインポートされている
-
- エラーの種類によって動作を変更する
use std::fs::File; use std::io::ErrorKind; fn main() { let f = File::open("hello.txt"); let f = match f { Ok(file) => file, Err(ref error) if error.kind() == ErrorKind::NotFound => { match File::create("hello.txt") { Ok(fc) => fc, Err(e) => { panic!( //ファイルを作成しようとしましたが、問題がありました "Tried to create file but there was a problem: {:?}", e ) }, } }, Err(error) => { panic!( "There was a problem opening the file: {:?}", error ) }, }; }
-
io::ErrorKind
と言うenumが標準ライブラリで提供されている-
kind
メソッドで取得できる
-
- matchアームに条件式を追加することで、
true
の時のみ実行される
-
-
unwrap
メソッドで、OkならOkの中身を返し、Errならpanic!
を呼んでくれるlet f = File::open("hello.txt").unwrap();
-
expect
はエラーメッセージも指定できるlet f = File::open("hello.txt").expect("Failed to open hello.txt");
-
Result
を返して、エラーを委譲する- つまり
throw
するみたいなことね -
?
演算子で、Errの時そのErrを自動的にリターンしてくれるf.read_to_string(&mut s)?;
- なんか最後に?ついてるコード見たことある気がする、これか〜
- 連結もできるぞ!
File::open("hello.txt")?.read_to_string(&mut s)?;
-
Result
を返す関数の中でしか使えないので注意
- つまり
本日のまとめ
Rustにおけるエラー処理の片鱗を味わった
ちょっとこれ毎回書くのめんどくさそうだな〜という部分には省略できる記法が存在していて、痒いところに手が届くという感じ
panicするのかResultするのかという部分については従来の開発と考えとして変わらなそうだと思ったので省略
明日はとうとう10章
来たな、ライフタイム・・・!
Discussion