Go語言-panic和recover使用實戰

panic

正常的函數執行流程將立即終止,但函數中之前使用defer關鍵字延遲執行的語句將正常展開執行,之後該函數將返回到調用函數,並導致逐層向上執行panic()流程,直到所屬的goroutine中所有正在執行的函數將被終止。錯誤信息將被報告,包括panic()的參數類型interface()我們可以看到,panic可以接收任意類型的數據
panic(404)
panic("network borken")
panic("Error("file not exists")

recover

recover函數用於終止錯誤處理流程。recover應該在defer關鍵字的函數中執行以有效截取錯誤處理流程

實例1

package main

import (
    "fmt"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("detail:", r)
        }
    }()

    fmt.Println("before painc")
    panic("error1")
    panic("error2")
    fmt.Println("after panic")
    return
}

運行結果

before painc
detail: error1

實例2

package main

import (
    "fmt"
)

func main() {
    fmt.Println("before painc")
    panic("error1")
    panic("error2")
    fmt.Println("after panic")
    return
}

運行結果

before painc
panic: error1

goroutine 1 [running]:
main.main()
    /home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:17 +0xdd

實例3

package main

import (
    "fmt"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("detail:", r)
        }
    }()

    test()
    fmt.Println("end")
    return
}

func test() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("detail0:", r)
        }
    }()
    fmt.Println("before painc")
    panic("error1")
    panic("error2")
    fmt.Println("after panic")
}

運行結果

before painc
detail0: error1
end

實例4

package main

import (
    "fmt"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("detail:", r)
        }
    }()

    test()
    fmt.Println("middle")
    panic("error3")
    fmt.Println("end")
    return
}

func test() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("detail0:", r)
        }
    }()
    fmt.Println("before painc")
    panic("error1")
    panic("error2")
    fmt.Println("after panic")
}

運行結果

before painc
detail0: error1
middle
detail: error3

實例5

package main

import (
    "fmt"
)

func main() {

    test()
    fmt.Println("middle")
    panic("error3")
    fmt.Println("end")
    return
}

func test() {
    fmt.Println("before painc")
    panic("error1")
    panic("error2")
    fmt.Println("after panic")
}

運行結果:

before painc
panic: error1

goroutine 1 [running]:
main.test()
    /home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:20 +0xdd
main.main()
    /home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:10 +0x26
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章