構造体、列挙型、トレイト
Rust Error Handling: Result and ?
Errors are values in Rust. Return Result, handle it with match, and pass errors on with ?.
学べること
- Ok and Err
- The ? operator
- Your own error messages
parse_and_double("abc")
- 1
text.parse()fails - 2
?returns early - 3
Err(...)the caller gets the error
Success or error, as a value
Rust has no exceptions. A function that can fail returns Result<T, E>, which is either Ok(value) or Err(error). The caller decides what to do with the error.
The ? after parse returns the error to the caller at once when parsing fails; otherwise it gives the number. divide uses a String as its error type and returns Err for a zero divisor. match prints the value or the error message.
重要なポイント
- Result<T, E> is
Ok(value)orErr(error). - ? returns the error to the caller at once.
- The caller decides what to do.
実行できる Rust のサンプル
Rust
main.rs
use std::num::ParseIntError;
fn parse_and_double(text: &str) -> Result<i32, ParseIntError> {
let number: i32 = text.trim().parse()?; // ? returns the error early
Ok(number * 2)
}
fn divide(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
return Err(String::from("cannot divide by zero"));
}
Ok(a / b)
}
fn main() {
for input in ["21", "abc"] {
match parse_and_double(input) {
Ok(value) => println!("{input} -> {value}"),
Err(error) => println!("{input} -> error: {error}"),
}
}
println!("{:?}", divide(10, 2));
println!("{:?}", divide(1, 0));
}
21 -> 42
abc -> error: invalid digit found in string
Ok(5)
Err("cannot divide by zero")練習
サンプルをオンラインコンパイラーで開き、値を変えたり行を追加したりして、実行する前に出力を予想してみましょう。次に、わざとコードを壊してコンパイラーのメッセージを読んでみてください。
このレッスンを終えましたか?
学習済みにすると進み具合を記録できます。
進み具合はこのブラウザーに保存されています ログインすると、どのデバイスでも引き継げます。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- 最初の無効な年齢 入力された年齢を検証し、プログラムがクラッシュする代わりに最初の不正な入力位置を報告します。 簡単
- 有効な数だけを合計する 整数の項目だけを合計し、それ以外は try/except で不正入力を扱うように無視します。 簡単