石家庄网站建站公司,建设机械网站平台,北京建设官方网站,网站建设合同有效期1)说明go的异常捕获需要延迟函数defer recover实现,在函数返回前,就可以捕获到, 这样其实比java的try catch更加优雅一点#xff1b;比如: web服务器程序崩溃前,需要做一些清理,那么就可以这样搞定#xff1b;还可以在捕获时#xff0c;打印一些信息,继续panic,让错误往上抛…1)说明go的异常捕获需要延迟函数defer recover实现,在函数返回前,就可以捕获到, 这样其实比java的try catch更加优雅一点比如: web服务器程序崩溃前,需要做一些清理,那么就可以这样搞定还可以在捕获时打印一些信息,继续panic,让错误往上抛2)案例package mainimport (fmtruntime)type panicContext struct {function string}func ProtectRun(entry func()) {defer func() {err : recover()switch err.(type) {case runtime.Error:fmt.Println(runtime error:, err)default:fmt.Println(error:, err)}}()entry()}func g() {defer func() {err : recover()switch err.(type) {case runtime.Error:fmt.Println(g() runtime error:, err)default:fmt.Println(g() error:, err)}}()var b *int/*注意: 这行改为*b 1/0 这样, 被除数是0,直接编译报错$ go build main.go# command-line-arguments.\main.go:38:8: division by zero*/*b 1}func main() {fmt.Println(运行前)ProtectRun(func() {fmt.Println(手动宕机前)panic(panicContext{手动触发panic})fmt.Println(手动宕机后)})ProtectRun(func() {fmt.Println(赋值宕机前)var a *int*a 1fmt.Println(赋值宕机后)})g()fmt.Println(运行后)}/*$ ./main.exe运行前手动宕机前error: {手动触发panic}赋值宕机前runtime error: runtime error: invalid memory address or nil pointer dereferenceg() runtime error: runtime error: invalid memory address or nil pointer dereference运行后*/来源oschina链接https://my.oschina.net/u/4368807/blog/4327637