После короткой попытки, когда я запускаю тест 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());
Doing небольшая отладка, я вижу, что 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 даже есть раздел под названием «Результаты должны быть использованы» ,
Результат помечен атрибутом #[must_use]
, который заставит компилятор выдает предупреждение, когда значение Result игнорируется. Это делает Result особенно полезным для функций, которые могут обнаруживать ошибки, но в противном случае не возвращают полезное значение. [...] Если вы напишете это в Rust, компилятор выдаст вам предупреждение (по умолчанию ...
Где задокументировано это поведение? Какие другие основные функции допускают ошибки go unhandeld?