专栏名称: 运维玄德公
运维三阶段:<br>1)南北驱驰报主情,江花...
目录
今天看啥  ›  专栏  ›  运维玄德公

05-内建方法-panic/recover

运维玄德公  · 简书  ·  · 2021-11-20 20:57
    

文章预览

1. panic

单独使用panic,发现错误后程序退出

1.1 代码

package main

func main () {
    println("北伐曹魏")
    receivePanic()
    println("恢复汉室")
}

func receivePanic(){
    panic("武侯挂了")
}

1.2 结果

image.png

一个悲伤的故事,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 结果

image.png

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 结果

image.png
………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览