defer, panic,cover

不完全翻译Golang Bolg,defer-panic-and-recover

defer

defer将一个函数推入列表,并在所有函数执行完成之后执行,因此常用来处理一些善后工作

defer包含以下规则:

  • 如果defer函数包含参数,那么参数的值在执行到defer声明的地方的时候就已经确定了
  • 多个defer函数,是按照先进后出的规则处理的
  • 如果指定了返回参数名称,那么defer是可以修改返回参数的值,如果没有指定名称,那么将不能修改

Panic

Panic是一个内建函数,被设计用来停止程序控制流继续运行并引发一个异常.

假设有一个函数F,当F执行到panic的时候,会触发一下事件:

  • 函数F将会停止运行
  • 定义在F函数中使用defer声明的的函数将会继续运行 然后F函数返回给调用者,对于调用者而言,就像是调用了一个异常函数.然后进程继续执行, 直到调用者这个goroutine中的所有函数执行完毕为止,这个时候程序就会崩溃

Recover

Recover是一个内建的函数,被设计用来对Panic进行控制

在正常的执行过程中,调用recover将会返回一个nil,除此之外没有任何影响 如果当前的goroutine中出现异常,那么将会捕获异常值,并且使得goroutine继续运行

示例

package main

import "fmt"

func main() {
    f()
    fmt.Println("returned normally from f.")
}

func f() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()
    fmt.Println("calling g.")
    g(0)
    fmt.Println("Returned normally from g")
}

func g(i int) {
    if i > 3 {
        fmt.Println("panicking!")
        panic(fmt.Sprintf("%v", i))
    }
    defer fmt.Println("defer in g", i)
    fmt.Println("Printing in g", i)
    g(i + 1)
}

results matching ""

    No results matching ""