golang之panic,recover,defer
defer,recover:
运行时恐慌一旦被引发,就会向调用方传播直至程序崩溃。
recover内建函数用于“拦截”运行时恐慌,可以使当前的程序从恐慌状态中恢复并重新获得流程控制权。
recover函数被调用后,会返回一个interface{}类型的结果。如果当时的程序正处于运行时恐慌的状态,那么这个结果就是非nil的
package main import ( "fmt" "time" ) func test() { defer func() { //defer中使用recover来捕获异常 //defer在函数执行结束最后,执行该方法 if err := recover(); err != nil { fmt.Println(err) } }() b := 0 a := 100 / b fmt.Println(a) return } func main() { for { test() time.Sleep(time.Second) } var a []int a = append(a, 10, 20, 383) a = append(a, a...) fmt.Println(a) }
panic:
为了报告运行期间的致命错误
用于停止当前的控制流程并引发一个运行时错误,它可以接受一个任意类型的参数值,参数值类型常常是string或者error
package main import ( "errors" "fmt" "time" ) func initConfig() (err error) { return errors.New("init config failed") } func test() { //defer func() { // //defer中使用recover来捕获异常 // //defer在函数执行结束最后,执行该方法 // if err := recover(); err != nil { // fmt.Println(err) // } //}() err := initConfig() if err != nil { panic(err) } return } func main() { for { test() time.Sleep(time.Second) } var a []int a = append(a, 10, 20, 383) a = append(a, a...) fmt.Println(a) }
go运行时系统引发的错误,如
func main() { myIndex := 4 ia := [3]int{1, 2, 3} _ = ia[myIndex] }
panic函数传入一个runtime.Error类型的参数值,runtime.Error是一个接口类型,并且内嵌了Go内置的error接口类型。
努力成为一个开发者
个人站点:www.pythonav.cn