zoukankan      html  css  js  c++  java
  • defer、panic、recover

    defer(延迟执行语句)

    多个延迟执行语句的处理顺序

    package main
    import (
        "fmt"
    )
    func main() {
        fmt.Println("defer begin")
        // 将defer放入延迟调用栈
        defer fmt.Println(1)
        defer fmt.Println(2)
        // 最后一个放入, 位于栈顶, 最先调用
        defer fmt.Println(3)
        fmt.Println("defer end")
    }

    结果分析如下:

    • 代码的延迟顺序与最终的执行顺序是反向的。
    • 延迟调用是在 defer 所在函数结束时进行,函数结束可以是正常返回时,也可以是发生宕机时。

    使用延迟执行语句在函数退出时释放资源

    处理业务或逻辑中涉及成对的操作是一件比较烦琐的事情,比如打开和关闭文件、接收请求和回复请求、加锁和解锁等。在这些操作中,最容易忽略的就是在每个函数退出处正确地释放和关闭资源。
    defer 语句正好是在函数退出时执行的语句,所以使用 defer 能非常方便地处理资源释放问题。

    panic——程序终止运行

    package main
    func main() {
        panic("crash")
    }

    在宕机时触发延迟执行语句

    当 panic() 触发的宕机发生时,panic() 后面的代码将不会被运行,但是在 panic() 函数前面已经运行过的 defer 语句依然会在宕机发生时发生作用,参考下面代码

    package main
    import "fmt"
    func main() {
        defer fmt.Println("宕机后要做的事情1")
        defer fmt.Println("宕机后要做的事情2")
        panic("宕机")
    }

    输出结果为:

    宕机后要做的事情2
    宕机后要做的事情1
    panic: 宕机
    
    goroutine 1 [running]:
    main.main()
        F:/src/tester/main.go:8 +0x1a4

    recover

    无论是代码运行错误由 Runtime 层抛出的 panic 崩溃,还是主动触发的 panic 崩溃,都可以配合 defer 和 recover 实现错误捕捉和恢复,让代码在发生崩溃后允许继续运行。

    defer func() {
        if r:= recover();r != nil{
            log.Printf("Runtime error caught :%v",r)
        }
    }()
    
    foo()
  • 相关阅读:
    MySQL(2)---Explain
    MySQL(1)---索引
    php 的 PHPExcel1.8.0 使用教程
    通过html5 的EventSource来进行数据推送
    centos6.6 下 安装 php7 按 nginx方式
    IIS PHP Warning: Unknown: open(c:\php\tmp\sess_xxx, O_RDWR) failed: Permission denied (13) in Unknown on line 0
    动态加载JS,并执行回调函数
    nginx 504 gateway time out
    php 账号不能同时登陆,当其它地方登陆时,当前账号失效
    php 函数中静态变量的问题
  • 原文地址:https://www.cnblogs.com/domestique/p/9978321.html
Copyright © 2011-2022 走看看