Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Rust has an operator for "re-throwing" error: question mark.

  fn foo() -> Result<int, SomeError> {
     let result = bar()?;
     let result2 = baz()?;
     let result3 = bazz()?;
     Ok(result + result2 + result3)
  }
It's still 100% more explicit about return types and errors, but has the same lightweight feel as in JS/Java/etc.


In your example if bar() returned an error your program still needlessly calls baz() correct? This is why exceptions are better.


Nope, the question mark operator is syntax sugar for the "if error, return it" dance.

(Cf. https://doc.rust-lang.org/edition-guide/rust-2018/error-hand...)


That code desugars to the following

  fn foo() -> Result<int, SomeError> {
     let result = match bar() {
         Ok(val) => val,
         Err(err) => return Err(err.into()),
     };
     let result2 = match baz()  {
         Ok(val) => val,
         Err(err) => return Err(err.into()),
     };
     let result3 = match bazz() {
         Ok(val) => val,
         Err(err) => return Err(err.into()),
     };
     Ok(result + result2 + result3)
  }


Nope, it returns an error if bar returns an error - immediately. It's essentially shorthand for `if x.is_none() return X;`




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: