panic
panic
会终止程序并退出,因此只有在发生严重的错误时才会使用 panic
。
例子
主动触发
package main
func main() {
panic("some error...")
}
// $ go run main.go
// 输出如下
/**
panic: some error...
goroutine 1 [running]:
main.main()
/home/codes/Go-examples-for-beginners/main.go:4 +0x27
exit status 2
*/
除 0
package main
import "fmt"
func main() {
fmt.Println("除数不能为 0")
n := 0
fmt.Printf("5 / 0 = %d", 5/n)
}
// $ go run main.go
// 输出如下
/**
除数不能为 0
panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.main()
/home/codes/Go-examples-for-beginners/main.go:15 +0x57
exit status 2
*/
recover
建议先阅读 defer 小节。
recover
会终止 panic
状态并且返回 panic
的值,函数会从 panic
之前执行到的地方直接返回,不会继续往下执行。
语法规则
recover
和 defer
必须配套使用, 如果 recover
在其他地方执行会返回 nil
,不会产生任何效果。 defer
必须在 panic
之前声明,否则 panic
会直接终止程序。
例子
错误捕获
package main
import "fmt"
func main() {
if r := recover(); r != nil {
fmt.Printf("捕获到 1 个错误: %v\n", r)
}
panic("测试")
println("程序执行不到这里")
}
// $ go run main.go
// 输出如下
/**
panic: 测试
...
...
exit status 2
*/
正确捕获
package main标签:defer,recover,fmt,go,Go,main,panic From: https://blog.51cto.com/u_15915979/5967431
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Printf("捕获到 1 个错误: %v\n", r)
}
}()
panic("测试")
println("程序执行不到这里")
}
// $ go run main.go
// 输出如下
/**
捕获到 1 个错误: 测试
*/