【发布时间】:2020-05-06 03:11:49
【问题描述】:
经过短暂的尝试,当我为 exercises/error_handling/errorsn.rs 运行 Rustling 测试时,我得到了
---- 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!"))
所以我现在可以说我不应该在任何地方写“uh-oh!”。查看我的错误的原因,错误代码they provide (which we're supposed to fix) has,
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 甚至还有一个名为 "Results must be used" 的部分,
Result 使用
#[must_use]属性进行注释,这将导致编译器在忽略 Result 值时发出警告。这使得 Result 对于可能遇到错误但不会返回有用值的函数特别有用。 [...] 如果你用 Rust 编写,编译器会给你一个警告(默认情况下......
这种行为记录在哪里?还有哪些核心功能可以让错误无法处理?
【问题讨论】:
-
?您是否明确使用了Result。无论调用read_line的函数也将返回Result,以便在某个地方进行处理。也许如果您将问题扩展为有关来电者的详细信息,有人可以提供更清晰的答案? -
我的问题是为什么当我不使用结果时,它甚至可以编译?
.read_line否则会返回我没有使用的结果。要求b.read_line(&mut line)?;是有道理的。为什么b.read_line(&mut line);甚至被允许对我来说是没有意义的。 -
未使用的
Result不是错误,而是警告。将#![deny(warnings)]添加到lib.rs的顶部,原来的变体应该会失败。 -
啊,我明白了。通常我必须在精神上将这些警告视为错误。当你这样做时,我什至不知道它编译。现在我根本没有收到警告。所以 Rustlings 一定是在吃编译器警告,这使得使用 Rustlings 比使用 Rust 更难。
标签: rust compiler-errors rust-result