Why am I getting "unused Result which must be used ... Result may be an Err variant, which should be handled" even though I am handling it?

12,294

You're not handling the result, you're mapping the result from one type to another.

foo().map_err(|err| println!("{:?}", err));

What that line does is call foo(), which returns Result<(), std::io::Error>. Then map_err uses the type returned by your closure (in this case, ()), and modifies the error type and returns Result<(), ()>. This is the result that you are not handling. Since you seem to want to just ignore this result, the simplest thing to do would probably be to call ok().

foo().map_err(|err| println!("{:?}", err)).ok();

ok() converts Result<T,E> to Option<T>, converting errors to None, which you won't get a warning for ignoring.

Alternatively:

match foo() {
    Err(e) => println!("{:?}", e),
    _ => ()
}
Share:
12,294

Related videos on Youtube

marathon
Author by

marathon

Updated on June 13, 2022

Comments

  • marathon
    marathon 6 months
    fn main() {
        foo().map_err(|err| println!("{:?}", err));
    }
    fn foo() -> Result<(), std::io::Error> {
        Ok(())
    }
    

    results:

    warning: unused `std::result::Result` that must be used
     --> src/main.rs:2:5
      |
    2 |     foo().map_err(|err| println!("{:?}", err));
      |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      |
      = note: #[warn(unused_must_use)] on by default
      = note: this `Result` may be an `Err` variant, which should be handled
        Finished dev [unoptimized + debuginfo] target(s) in 0.58s
         Running `target/debug/playground`
    

    playground link

    • Sebastian Redl
      Sebastian Redl about 4 years
      You are "handling" the error returned by foo(), but not the error returned by map_err(...).
  • Jmb
    Jmb about 4 years