本周 MoonBit 语法支持添加错误处理机制、Map 字面量语法

11 天前
 moonbitlang

MoonBit 更新

  1. 函数返回值类型可以用 Int!String 来标识这个函数正常情况下返回 Int ,错误情况下会抛出类型为 String 的错误值,比如
fn div(x: Int, y: Int) -> Int!String { .. }
  1. raise 关键字用于中断当前控制流,直接抛出错误,比如
fn div(x: Int, y: Int) -> Int!String {
  if y == 0 { raise "divide by 0" }
  x / y
}
  1. try { expr0 } catch { pattern1 => expr1; pattern2 => expr2; .. } 表达式可以用于捕获 expr0 中抛出的错误,并对其进行模式匹配来处理,比如下面这个函数调用上面的 div 函数,并在 div 函数抛出错误的时候将错误信息打印,并返回默认值
fn div_with_default(x: Int, y: Int, default: Int) -> Int {
  try {
    div(x, y)!
  } catch {
    s => { println(s); default }
  }
}
  1. 此外,可以用后缀运算符 !!! 进行错误处理,这些后缀运算符只能应用于函数调用,其中: f(x)! 将调用 f 的过程中发生的错误立即重新抛出,其等价于
try { f(x)! } catch { err => raise err }

f(x)!! 则会在 f 发生错误的情况下直接 panic ,其等价于

try { f(x)! } catch { _ => panic() }

函数调用的形式包括方法调用,中缀运算符和管道运算符的调用,比如

fn init {
  let _ = x.f()!!
  let _ = (x + y)!!
  let _ = (x |> f)!!
}
  1. 最后,对可能会抛出错误的函数如果没有使用上述任何错误处理,那么则会报 unhandled error 的错误
fn init {
  // 键必须是字面量
  let m1 : Map[String, Int] = { "x": 1, "y": 2 }
  let m2 : Map[Int, String] = { 1: "x", 2: "y" }
}

IDE 更新

构建系统更新

466 次点击
所在节点    推广
3 条回复
w568w
11 天前
这个错误处理的设计是出于什么思想?看起来很像 Ziglang/Rust 的「错误即返回值」模式和传统的 Exception 模式杂糅在一起……

如何保证不会提高处理错误的复杂度?原先只需要考虑一种错误,现在要同时考虑两种可能的异常程序流了
w568w
11 天前
补充一句:感觉最后可能会演变成,第三方库分为 return 派和 raise 派各自为政……
w568w
11 天前
@w568w #2 仔细读了一下 spec 原来是统一的,那没事了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1050307

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX