溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go語(yǔ)言-panic和recover使用實(shí)戰(zhàn)

發(fā)布時(shí)間:2020-07-13 19:10:27 來(lái)源:網(wǎng)絡(luò) 閱讀:848 作者:二郎神六號(hào) 欄目:軟件技術(shù)

panic

正常的函數(shù)執(zhí)行流程將立即終止,但函數(shù)中之前使用defer關(guān)鍵字延遲執(zhí)行的語(yǔ)句將正常展開(kāi)執(zhí)行,之后該函數(shù)將返回到調(diào)用函數(shù),并導(dǎo)致逐層向上執(zhí)行panic()流程,直到所屬的goroutine中所有正在執(zhí)行的函數(shù)將被終止。錯(cuò)誤信息將被報(bào)告,包括panic()的參數(shù)類型interface()我們可以看到,panic可以接收任意類型的數(shù)據(jù)
panic(404)
panic("network borken")
panic("Error("file not exists")

recover

recover函數(shù)用于終止錯(cuò)誤處理流程。recover應(yīng)該在defer關(guān)鍵字的函數(shù)中執(zhí)行以有效截取錯(cuò)誤處理流程

實(shí)例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
}

運(yùn)行結(jié)果

before painc
detail: error1

實(shí)例2

package main

import (
    "fmt"
)

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

運(yùn)行結(jié)果

before painc
panic: error1

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

實(shí)例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")
}

運(yùn)行結(jié)果

before painc
detail0: error1
end

實(shí)例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")
}

運(yùn)行結(jié)果

before painc
detail0: error1
middle
detail: error3

實(shí)例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")
}

運(yùn)行結(jié)果:

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
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI