7. 错误处理:Result 与 ?

Dawn 没有异常。可恢复的错误走 Result[T, E]?Ok/Some 时取值、 在 Err/None 时提前返回。不可恢复的用 panic(它不返回,故不需要 !io)。

fn half(x: Int) -> Result[Int, String] =
  if x % 2 == 0 { Ok(x / 2) } else { Err("$x 是奇数") }

fn quarter(x: Int) -> Result[Int, String] = {
  let h = half(x)?
  half(h)
}

pub fn main() -> Unit !io =
  match quarter(20) {
    Ok(v) -> println("得到 $v")
    Err(e) -> println("错误:$e")
  }
在 Playground 打开
得到 5