2 回答

TA貢獻1841條經(jīng)驗 獲得超3個贊
在Go你必須從恐慌中恢復(fù)過來,它確實包含了恐慌的錯誤信息的可能性?;謴?fù)后,您可以分析發(fā)生恐慌的問題。要從恐慌中恢復(fù),您可以使用defer語句,顧名思義,它會延遲語句的執(zhí)行。這意味著你可以跳過一些事件來掛斷系統(tǒng),這不是一個很好的解決方案。最好的解決方案是捕獲錯誤并充分處理它們。如果錯誤發(fā)生在某些第三方框架上,則應(yīng)由其創(chuàng)建者解決。如果不是,您應(yīng)該檢查為什么您的代碼會出現(xiàn)恐慌。
這是恐慌恢復(fù)的代碼片段:
defer func() {
if err := recover(); err != nil {
fmt.Printf("Recovered from panic. %s", err)
}
}()
這是一個簡單的示例,說明如何在恐慌和恢復(fù)方法中使用構(gòu)建:
package main
import "fmt"
func badCall() {
panic("Bad call happend!")
}
func test() {
defer func() {
if err := recover(); err != nil {
fmt.Printf("Panicking %s\n\r" , err)
}
}()
badCall()
fmt.Println("This is never executed!!")
}
func main() {
fmt.Println("Start testing")
test()
fmt.Println("End testing")
}
http://play.golang.org/p/Uz9W76SfRT
如果在延遲函數(shù)內(nèi)調(diào)用了recover,則堆棧將停止展開并返回interface{}傳遞給panic的值(作為?。_@意味著您可以將接口作為參數(shù)傳遞給 panic 方法,例如:
type ParseError struct {
Index int // The index into the space-separated list of words.
Word string // The word that generated the parse error.
Error error // The raw error that precipitated this error, if any.
}
// String returns a human-readable error message.
func (e *ParseError) String() string {
return fmt.Sprintf("pkg: error parsing %q as int", e.Word)
}
// ... some code
if err != nil {
panic(&ParseError{idx, field, err})
}
// ... some code
然后就可以分析 deferred 語句中傳入的接口了。
閱讀這篇文章:https : //github.com/golang/go/wiki/PanicAndRecover

TA貢獻1828條經(jīng)驗 獲得超3個贊
您可以使用這段代碼并將其放置在每個函數(shù)中
defer func() {
if err := recover(); err != nil {
fmt.Println("Panic Occured and Recovered in, Error Info: ", err)
}
}()
試試這個它會為你工作。
- 2 回答
- 0 關(guān)注
- 224 瀏覽
添加回答
舉報