短い試行の後、Rustling テストを実行すると、次のexercises/error_handling/errorsn.rs
ようになります。
---- test_ioerror stdout ----
thread 'test_ioerror' panicked at 'assertion failed: `(left == right)`
left: `"uh-oh!"`,
right: `"cannot parse integer from empty string"`', exercises/error_handling/errorsn.rs:69:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
69行目は
assert_eq!("uh-oh!", read_and_validate(&mut b).unwrap_err().to_string());
私が見ることができる少しのデバッグを行うと、read_and_validate(&mut b)
戻ってきます。
Err(ParseIntError { kind: Empty })
これを改善するための私の最初の試みは、
let num: i64 = line.trim().parse().or(Err("uh-oh!")?;
uh-oh!
しかし、これは私が見たコードで探すのが無意味に厄介に思えました。
Err(io::Error::new(io::ErrorKind::BrokenPipe, "uh-oh!"))
ですから、この時点で「うーん!」と書くべきではなかったことがわかりました。どこでも。私のエラーの原因を見ると、彼らが提供するバグのあるコード (私たちが修正することになっている) には、
b.read_line(&mut line); # unmodified notice they don't have `?`
私がしなければならなかったのは、それを次のように変更することでした。
b.read_line(&mut line)?; # I added the `?`
let num: i64 = line.trim().parse()?;
それはすべて簡単ですが、意味がありません。見上げる.read_line
と、 が返されますResult
。
このすべての最後に私の質問は、なぜ呼び出し元が.read_line
返されるエラーを処理する必要がないのですか? このRustlingsからの教訓は、タイプセーフに頼ることはできないとユーザーに伝えようとしているようです。ドキュメントを見てください。これはすべて文書化されていないようです。Rustには、「結果を使用する必要がある」というタイトルのセクションさえあります。
Result には属性の注釈が付けられ
#[must_use]
ます。これにより、コンパイラは Result 値が無視されたときに警告を発行します。これにより、Result は、エラーが発生する可能性があるが、それ以外の場合は有用な値を返さない関数で特に役立ちます。[...] Rustでそれを書くと、コンパイラは警告を出します(デフォルトでは...
この動作はどこに文書化されていますか? エラーを処理できないようにする他のコア関数は何ですか?