go 中recover捕獲異常


recover 僅在延遲函數 defer 中有效,在正常的執行過程中,調用 recover 會返回 nil 並且沒有其他任何效果.
重要的事再說一遍:僅當在一個defer函數中被完成時,調用recover()才生效。

我們來一段錯誤的代碼:

package main

import "fmt"

func main() {
    recover() // 無任何作用
    panic("停止運行")
    recover() // 不會執行到
    fmt.Println("結束")
}

輸出:

panic: 停止運行

goroutine 1 [running]:exit status 2

修改下,正確的代碼:

package main

import "fmt"

func main() {
    defer func() {
        fmt.Println("捕獲到異常:", recover())
    }()
    panic("手動拋出異常")
}

輸出:

捕獲到異常: 手動拋出異常

重要的事再說一遍:recover()的調用僅當它在defer函數中被直接調用時才有效。

繼續來看一段錯誤的代碼:

package main

import "fmt"

func doRecover() {
    fmt.Println("捕獲到異常 =>", recover()) //輸出: 捕獲到異常 => <nil>
}
func main() {
    defer func() {
        doRecover() //注意:這里間接使用函數,在函數中調用了recover()函數,
        // panic 沒有恢復,沒有捕獲到錯誤信息
    }()
    panic("手動拋出異常")
}

輸出:

捕獲到異常 => <nil>
panic: 手動拋出異常
goroutine 1 [running]:
main.main()
exit status 2

總結:panic配合recover使用,recover要在defer函數中直接調用才生效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM