EffectsOf 编译指示
异常追踪推断规则(见之前的小节)的第一条与第二条确保可以获得下面的预期效果:
proc 我们不抛异常但是回调可能抛(callback: proc()) {.raises: [], effectsOf: callback.} =
callback()
proc 抛异常() {.raises: [IOError].} =
raise newException(IOError, "IO")
proc use() {.raises: [].} =
# 编译失败! 会抛出 IOError 错误!
我们不抛异常但是回调可能抛(抛异常)
如这个例子所示, proc (…) 类型的参数可以标记为 .effectsOf 。这样的参数带来了 effect 多态: 过程 我们不抛异常但是回调可能抛 可以抛出 callback 所抛出的异常。
所以在很多情况下,回调并不会导致编译器在 effect 分析中过于保守:
{.push warningAsError[Effect]: on.}
import algorithm
type
MyInt = distinct int
var toSort = @[MyInt 1, MyInt 2, MyInt 3]
proc cmpN(a, b: MyInt): int =
cmp(a.int, b.int)
proc harmless {.raises: [].} =
toSort.sort cmpN
proc cmpE(a, b: MyInt): int {.raises: [Exception].} =
cmp(a.int, b.int)
proc harmful {.raises: [].} =
# 无法编译, `sort` 当前将引发异常
toSort.sort cmpE
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .