2014-09-26 174 views
1

我想弄清楚如何恢复和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!从不打印?

回答

2

应用程序必须调用直接从延迟函数中恢复来处理恐慌。

关于推迟函数调用恢复的specification会谈:

假设一个函数G推迟功能d调用恢复,并在其中G执行相同够程的功能发生了恐慌。当延迟函数运行到达D时,D的呼叫恢复的返回值将是传递给恐慌调用的值。

这很微妙,但它不允许间接调用恢复。此外,从回收的返回值的通道提到从延迟函数直接调用:

恢复的返回值是零,如果任何下列条件成立:

  • 收复不叫直接由延期功能。

我最近被这个问题困住了。由于规格非常简洁,有时需要仔细阅读才能获得一些观点。

1

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,你不会惊慌。