2014-09-26 75 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,你不會驚慌。