Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。
这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。
如果函数中可能会有panic,可以用recover来恢复环境,保证程序不会退出,在recover处理中修改可以修改返回值变量,从而修改了函数的返回值。如下:
package main
import "fmt"
func testPanic() (ret int) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
ret = 3
}
}()
arr := [3]int{}
i := 4
fmt.Println(arr[i])
return 0
}
func main() {
fmt.Println("bbbbb")
fmt.Println(testPanic())
fmt.Println("eeeee")
}