这次我们来看看异常处理和异步处理,顺带 Lambda 语法。
异常处理
Lite 沿用了现代面向对象语言的 try catch 机制,不同的是使用 !
来表达语法,不需要 try、catch、finally 这几个关键字。
! {
# 此区域内所有逻辑都会被监听异常 #
do_something()
} ex IOException { # 捕获IO异常 #
throw(ex) # 继续抛出异常 #
} e { # 可以省略类型,捕获默认异常 #
throw(e)
} _ {
# 无论如何都会执行的操作,可以用来释放资源 #
}
资源回收处理
计算机有很多资源都是需要使用完毕后立即释放的,在这里可以使用资源处理语法 ! id = value
语法声明资源,逻辑离开区域后就会自动释放,避免了手动控制。
! file = open_file("./test.lite")
# 逻辑处理完后自动释放 file #
Lambda 语法
上一次我们讲过如何传递函数类型的参数,除了直接使用预先定义好的函数标识符,我们还可以直接创建匿名函数 。
useFunction( (i int ->) {
do_something()
})
当然了,这种方式有点啰嗦。我们既然知道了函数的具体类型,就可以交给编译器去分析声明,用更简单的 Lambda 语法 { id -> }
来帮我们声明函数。
useFunction( { i ->
do_something()
})
嗯,简单多了。
如果执行的函数只有一个函数参数,我们甚至可以省略外面的括号。
useFunction{ i -> do_something() }
这样就很棒了是不是?
异步处理
Lite 采用了现代的 async/await 语法进行异步逻辑处理。
语法很简单,还记得我们在函数中使用的箭头 ->
吗?我们只要改成 ~>
就声明了async函数。
do_something(~>) {
}
async函数可以在内部使用异步等待语法 <~
来执行其它的async函数。
它会自动包装返回值,使得可以用同步调用的语法来调用异步功能,简化了我们使用多线程的方式。
main(~>) {
value = <~ do_something()
}
do_something(~> v int) {
<~ sleep(1000)
<- 1
}
同样道理,我们在 Lambda 中也可以这样使用异步处理
do_something{ ~>
<~ sleep(1000)
}
结尾
以上就是 Lite 异常处理和异步处理的语法,对比起其它语言的语法是否更简洁呢?
下一次我们会来看看可选类型和泛型语法。