2 回答

TA贡献1841条经验 获得超3个赞
在Go你必须从恐慌中恢复过来,它确实包含了恐慌的错误信息的可能性。恢复后,您可以分析发生恐慌的问题。要从恐慌中恢复,您可以使用defer语句,顾名思义,它会延迟语句的执行。这意味着你可以跳过一些事件来挂断系统,这不是一个很好的解决方案。最好的解决方案是捕获错误并充分处理它们。如果错误发生在某些第三方框架上,则应由其创建者解决。如果不是,您应该检查为什么您的代码会出现恐慌。
这是恐慌恢复的代码片段:
defer func() {
if err := recover(); err != nil {
fmt.Printf("Recovered from panic. %s", err)
}
}()
这是一个简单的示例,说明如何在恐慌和恢复方法中使用构建:
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
如果在延迟函数内调用了recover,则堆栈将停止展开并返回interface{}传递给panic的值(作为!)。这意味着您可以将接口作为参数传递给 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条经验 获得超3个赞
您可以使用这段代码并将其放置在每个函数中
defer func() {
if err := recover(); err != nil {
fmt.Println("Panic Occured and Recovered in, Error Info: ", err)
}
}()
试试这个它会为你工作。
- 2 回答
- 0 关注
- 233 浏览
添加回答
举报