1. panic
单独使用panic,发现错误后程序退出
1.1 代码
package main
func main () {
println("北伐曹魏")
receivePanic()
println("恢复汉室")
}
func receivePanic(){
panic("武侯挂了")
}
1.2 结果

一个悲伤的故事,panic 武侯挂了。所以没有打印出“恢复汉室”
2. recover连用
捕捉错误,使程序继续运行
2.1 代码
package main
import "fmt"
func main () {
fmt.Println("北伐曹魏")
receivePanic()
fmt.Println("恢复汉室")
}
func receivePanic(){
defer func() {
message := recover()
fmt.Println("失败原因:",message)
}()
panic("武侯挂了")
}
2.2 结果

3. 规范写法
package main
import "fmt"
func main () {
fmt.Println("北伐曹魏")
receivePanic()
fmt.Println("恢复汉室")
}
func receivePanic(){
defer coverPanic()
panic("武侯挂了")
}
func coverPanic(){
message := recover()
fmt.Println("失败原因:",message)
}
4. 继续改造
- 用switch语句按类型给panic 信息分类
- panic给一个error信息(之前类型一直是string)
4.1 代码
package main
import (
"errors"
"fmt"
)
func main () {
fmt.Println("北伐曹魏")
receivePanic()
fmt.Println("恢复汉室")
}
func receivePanic(){
defer coverPanic()
panic(errors.New("武侯挂了"))
}
func coverPanic(){
message := recover()
switch message.(type) {
case string:
fmt.Println("string message: ",message)
case error:
fmt.Println("error message: ",message)
default:
fmt.Println("unknow panic")
}
}
4.2 结果

网友评论