Why does this code not compile?
use std::{fs, path::Path}; fn main() { let dir = Path::new("../FileSystem"); if !dir.is_dir() { println!("Is not a directory"); return; } for item in try!(fs::read_dir(dir)) { let file = match item { Err(e) => { println!("Error: {}", e); return; } Ok(f) => f, }; println!(""); } println!("Done"); } This is the error I get
error[E0308]: mismatched types --> src/main.rs:11:17 | 11 | for item in try!(fs::read_dir(dir)) { | ^^^^^^^^^^^^^^^^^^^^^^^ expected (), found enum `std::result::Result` | = note: expected type `()` found type `std::result::Result<_, _>` = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) I also tried the question mark operator:
for item in fs::read_dir(dir)? { Which had a different error:
error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> src/main.rs:11:17 | 11 | for item in fs::read_dir(dir)? { | ^^^^^^^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` | = help: the trait `std::ops::Try` is not implemented for `()` = note: required by `std::ops::Try::from_error` Previous versions of Rust had a similar error about std::ops::Carrier
Should I avoid try!() and ?? What is the best way to handle errors? Mostly I do it like this:
match error_prone { Err(e) => { println!("Error: {}", e); return; }, Ok(f) => f, }; But if I have to use that in a for loop, it's a complete mess
for i in match error_prone { // match code } { // loop code }
try!is a macro thatreturnsErrs automatically. You can't use it inmainbecausemaindoesn't return anything.for matchsyntax mentioned abovemainthat returnsResult<T, Box<Error>>and thenunwrapor handle that inmain.unwrapis basicallypanicon error right?println!("{}", path.unwrap().path().file_name().unwrap().to_str().unwrap());really? :p