经过短暂的尝试,当我对 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!"))
因此,我可以在这一点上告诉我,我不应该写“哦,哦!”。任何地方。查看我的错误原因,即错误的代码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"的部分,该行为记录在哪里?还有哪些其他核心功能可以使错误变得难以处理?
最佳答案
沙沙声不显示编译器警告。
您通常会看到的是警告,而不是错误。沙沙声不向最终用户反射(reflect)编译器警告。所以你什么也看不到。
如果要查看警告,请添加
#![deny(warnings)]
但是,RuSTLings代码中有很多警告,因此似乎不会在其他警告升级为错误之一停止编译之前就升级该警告。
rustlings watch
也会在遇到错误的第二秒停止观看。