go语言错误处理

1.panic与recover用法

package main
import (
    "fmt"
)
func main() {
    defer_call()
}

func defer_call() {
    defer func() { fmt.Println("打印前") }()
    defer func() { fmt.Println("打印中") }()
    defer func() { fmt.Println("打印后") }()
    defer func(){
        if r := recover();r != nil{
            fmt.Println(r)
        }

    }()
    fmt.Println("debug step 1")
    panic("触发异常")
        //log.Panic("error happend")      会被recover处理,
    //log.Fatalln("error happend")     会强行os.exit(1)
    fmt.Println("continue??")
}

答:
defer 是后进先出执行顺序,类似“栈”数据结构处理逻辑;代码执行到panic时,正常的函数执行会终止,“continue”即不会被打印,开始从下到上执行defer代码块,最后执行panic.
执行结果如下:

debug step 1
触发异常
打印后
打印中
打印前

关于defer执行顺序,按照本人的理解如下:

package main

import "fmt"

type message struct {
content string
}

func (p *message) set(c string) {
    p.content = c
}

func (p *message) print() string {
    fmt.Println("inner defer func")
    p.content += p.content
    return p.content
}

func main() {
m := &message{content: "Hello"}
defer fmt.Print(m.print())
fmt.Println(m.content)
m.set("World")
fmt.Println("我是有底线的")
fmt.Println(m.content)

}

运行结果为

inner defer func
HelloHello
我是有底线的
World
HelloHello
    原文作者:苏州运维开发
    原文地址: https://www.jianshu.com/p/45c0a3dc4390
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞