Gox语言中可以使用类似Go语言中的defer、recover机制来进行异常处理,例如:
defer fn() {
r = recover()
if r != nil {
println("recover:", r)
}
}()
f, err = os.Open("file.ql")
if err != nil {
fprintln(os.Stderr, err)
return 1
}
defer println("exit!")
defer f.Close()
println(10/0)
b = make([]byte, 8)
n, err = f.Read(b)
if err != nil {
fprintln(os.Stderr, "Read failed:", err)
return 2
}
println(string(b[:n]))
* 注:由于0.988版本后,为了减少不必要的文件体积,Gox已经放弃了其他脚本引擎,仅支持Qlang引擎,因此本文中有关其他脚本引擎的内容已经无效,仅留作对旧版本的参考。
Gox语言的Anko引擎版中,相较于Go语言特立独行的异常处理机制,引入了更常见一些的try-catch-finally组合。
首先,Gox语言中并没有defer关键字和recover函数,但有panic函数,可以抛出任意类型的异常,例如:
panic("this is a panic")
panic(123)
panic([1, "good morning", true])
panic({"a": 10, "b": "good morning", "c": true})
这些都是可以的。
Gox语言中,可以使用try-catch-finally组合来捕获panic出的异常,包括Go语言函数中产生的panic,然后进行相应的处理。例如:
try {
panic({"a": 10, "b": "good morning", "c": true})
} catch e {
printfln("error: %v", e)
} finally {
println("final")
}
try {
panic(123)
} catch e {
printfln("error: %v", e)
}
程序运行后输出:
error: map[a:10 b:good morning c:true]
final
error: 123
表明这些异常都被正确地捕获了。
可以看出,Gox语言中的异常处理,对于习惯了传统语言的开发者来说更好理解一些。但目前没有defer方式,反而对一些熟悉Go语言编程的开发者会觉得麻烦,例如在一些关闭打开的文件、关闭网络连接或数据库连接时会觉得不如defer方便。
实际上,一定程度上可以用finally代替defer函数的作用。另外,Gox语言中也支持用throw来抛出异常。