defer,recover:
运行时恐慌一旦被引发,就会向调用方传播直至程序崩溃。
recover内建函数用于“拦截”运行时恐慌,可以使当前的程序从恐慌状态中恢复并重新获得流程控制权。
recover函数被调用后,会返回一个interface{}类型的结果。如果当时的程序正处于运行时恐慌的状态,那么这个结果就是非nil的
package mainimport ( "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 mainimport ( "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接口类型。