defer, panic, recover使用总结

1. defer : 延迟调用。多个defer,依次入栈,在函数即将退出时,依次出栈调用

 1 package main
 2 import "fmt"
 3 func main() {
 4     defer func() {
 5         fmt.Println("defer one")   
 6     }()
 7     defer func() {
 8         fmt.Println("defer two")   
 9     }()
10     defer func() {
11         fmt.Println("defer three")  
12     }()
13 }

2. panic和defer结合使用:panic触发错误,defer依次出栈调用,没有recover捕获的情况下,最后才打印错误

 1 package main
 2 import "fmt"
 3 func main() {
 4     defer func() {
 5         fmt.Println("defer one")
 6     }()
 7     defer func() {
 8         fmt.Println("defer two")
 9     }()
10     defer func() {
11         fmt.Println("defer three")
12     }()
13     panic("panic here")
14 }

3. defer,panic, recover 结合使用,panic触发错误,defer依次出栈调用,直到被recover捕获,打印捕获的信息,之后继续defer出栈

例一:

 1 package main
 2 import "fmt"
 3 func main() {
 4     defer func() {
 5         fmt.Println("defer one")
 6     }()
 7     defer func() {
 8         fmt.Println("defer two")
 9     }()
10     defer func() {
11         if info := recover(); info != nil {
12             fmt.Println("catch: ", info)
13         }
14         fmt.Println("defer three")
15     }()
16     panic("panic here")
17 }

例二:

package main
import "fmt"
func main() {
    defer func() {
        fmt.Println("defer one")
    }()
    defer func() {
        if info := recover(); info != nil {
            fmt.Println("catch: ", info)
        }
        fmt.Println("defer two")
    }()
    defer func() {
        fmt.Println("defer three")
    }()
    panic("panic here")
}

例三:

package main
import "fmt"
func main() {
    defer func() {
        if info := recover(); info != nil {
            fmt.Println("catch: ", info)
        }
        fmt.Println("defer one")
    }()
    defer func() {
        fmt.Println("defer two")
    }()
    defer func() {
        fmt.Println("defer three")
    }()
    panic("panic here")
}

4. recover 必须在defer中调用,才有效,否则返回nil

package main
import "fmt"
func main() {
    if info := recover(); info != nil {
        fmt.Println("catch: ", info)
    } else {
        fmt.Println("recover return nil")
    }
    defer func() {
        fmt.Println("defer one")
    }()
    defer func() {
        fmt.Println("defer two")
    }()
    defer func() {
        fmt.Println("defer three")
    }()
    panic("panic here")
}

5. panic 其后的代码不会执行

例一:

package main
import "fmt"
func main() {
    defer func() {
        fmt.Println("defer one")
    }()
    defer func() {
        fmt.Println("defer two")
    }()
    defer func() {
        fmt.Println("defer three")
    }()
    panic("panic here")
    if info := recover(); info != nil {
        fmt.Println("catch: ", info)
    } else {
        fmt.Println("recover return nil")
    }
}

例二:

package main
import "fmt"
func main() {
    defer func() {
        fmt.Println("defer one")
    }()
    defer func() {
        if v := recover(); v != nil {
            fmt.Println("catch panic error: ", v)
        }
        fmt.Println("defer two")
    }()
    defer func() {
        fmt.Println("defer three")
    }()
    panic("panic here")
    fmt.Println("after panic")
}

 

转载于:https://www.cnblogs.com/BluePegasus/p/10926175.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值