运行时恐慌一旦被引发,就会向调用方传播直至程序崩溃。
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)
}
为了报告运行期间的致命错误
用于停止当前的控制流程并引发一个运行时错误,它可以接受一个任意类型的参数值,参数值类型常常是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接口类型。