恐慌并从包中恢复

我试图弄清楚如何panic()和recover()工作..


日志包

package log


import (

    "fmt"

)


func Recover() {

    fmt.Println("Recovering!")

    if err := recover(); err != nil {

        fmt.Println("Error message recovered!")

    }

}

主包

package main


import (

    "fmt"

    log "www/pkg/log"

)


func main() {

    defer func() {

        log.Recover()

    }()


    panic("Fake error!")

}

输出

Recovering!

panic: Fake error!

为什么Error message recovered!从不打印?


SMILET
浏览 198回答 2
2回答

九州编程

应用程序必须直接从延迟函数调用恢复来处理恐慌。该规范对递延函数调用会谈恢复:假设一个函数 G 推迟了一个调用恢复的函数 D,并且在 G 正在执行的同一个 goroutine 上的一个函数中发生了恐慌。当 deferred 函数的运行达到 D 时,D 调用 recovery 的返回值将是传递给调用 panic 的值。这很微妙,但它不允许间接调用来恢复。此外,关于recover返回值的段落提到了来自延迟函数的直接调用:如果满足以下任一条件,recover 的返回值为 nil:恢复不是由延迟函数直接调用的。我最近被这个问题抓住了。因为规范非常简洁,所以有时需要仔细阅读才能挑出一些要点。

小唯快跑啊

revocer 仅指当前 goroutine 的执行:文档说:Executing a call to recover inside a deferred function **(but not any function called by it)** stops the panicking sequence by restoring normal execution当你调用另一个函数时,它没有恐慌,因此在它中间调用恢复返回 nil,你没有抓住恐慌。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go