インターネットの強い人たちが絶賛するRustのすごいトコの一つ、エラーハンドリングを見ていきます。
実際のところ
matchでエラーの有無により挙動を切り替えできる。
use std::error::Error; use std::fs::File; fn complex_operation() -> Result<(), Box<dyn Error>> { // ファイル操作のエラー let file = File::open("data.txt")?; // io::Error → Box<dyn Error> // パースのエラー let number = "123".parse::<i32>()?; // io::Error → Box<dyn Error> Ok(()) } // 呼び出し側 fn main() { match complex_operation() { Ok(_) => println!("Success!"), Err(e) => println!("Error occurred: {}", e), } }
ここで、"?"演算子は以下のような挙動を展開……らしい。
なので、エラーが生じた瞬間に関数から出るという事になる。
演算子であってマクロではないので、マクロと呼ぶなら頭の皮を剥がれる覚悟をしないといけない。
let file = match File::open("data.txt") { Ok(file) => file, Err(e) => return Err(Box::new(e)), // ここでエラーを変換してreturn };