panic的作用:停止当前函数执行,一直向上返回,执行每一层的defer,直到遇到recover,panic被recover处理;如果没有遇到recover,则panic会导致程序退出。
    recover的作用:recover仅在defer调用中使用,用于获取panic的值并进行处理,如果无法处理,则recover可以重新panic。

    panic&recover示例1:

    1. func tryRecover() {
    2. defer func() {
    3. r := recover() // 获取panic的值
    4. if err, ok := r.(error); ok {
    5. fmt.Println("Error occurred:", err)
    6. } else {
    7. panic(r)
    8. }
    9. }()
    10. panic(errors.New("this is an error"))
    11. }
    12. func main() {
    13. tryRecover() // Error occurred: this is an error
    14. }

    panic&recover示例2:

    func tryRecover() {
        defer func() {
            r := recover() // 获取panic的值
            if err, ok := r.(error); ok {
                fmt.Println("Error occurred:", err)
            } else {
                panic(r)
            }
        }()
    
        b := 0
        a := 5 / b
        fmt.Println(a)
    }
    
    func main() {
        tryRecover() // Error occurred: runtime error: integer divide by zero
    }
    

    panic&recover示例3:

    func tryRecover() {
        defer func() {
            r := recover() // 获取panic的值
            if err, ok := r.(error); ok {
                fmt.Println("Error occurred:", err)
            } else {
                panic(fmt.Sprintf("I don't know what to do: %v", r))
            }
        }()
    
        panic(123)
    }
    
    func main() {
        tryRecover()
        // panic: 123 [recovered]
        //     panic: I don't know what to do: 123
    }