Gox语言中的异常处理defer-recover对panic和try-catch-finally-GX17

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来抛出异常。

猜你喜欢

转载自blog.csdn.net/weixin_41462458/article/details/107974927