恐慌处理或发生了什么

我不明白处理恐慌的最佳方法是什么。我可以编写自己的代码panic("bad data or empty source"),我将确定代码在这个确切位置失败的输出,但是如何处理不是我的方法中生成的恐慌。

现在我有这样的错误:


C:/gocode/src/github.com/revel/revel/panic.go:26 (0x4975a4) handleInvocationPanic: c.Response.Out.Write(debug.Stack()) 

C:/gocode/src/github.com/revel/revel/panic.go:12 (0x4b60ca) PanicFilter.func1: handleInvocationPanic(c, err) 

c:/go/src/runtime/asm_amd64.s:437 (0x45cc75) call32: CALLFN(·call32, 32) 

c:/go/src/runtime/panic.go:423 (0x42ec17) gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz)) 

C:/gocode/src/github.com/revel/revel/intercept.go:93 (0x4b6061) InterceptorFilter.func1: panic(err)

c:/go/src/runtime/asm_amd64.s:437 (0x45cc75) call32: CALLFN(·call32, 32)

c:/go/src/runtime/panic.go:423 (0x42ec17) gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))

c:/go/src/runtime/panic.go:42 (0x42d280) panicmem: panic(memoryError)

c:/go/src/runtime/signal_windows.go:161 (0x44233d) sigpanic: panicmem()

C:/gocode/src/github.com/oculus/libs/funcs.go:13 (0x4e0ca5) GetDatesInRange: fmt.Println(err.Error())

C:/gocode/src/github.com/oculus/rest/app/controllers/kpi.go:97 (0x4e3b2f) KpiCtrl.GetNoagg: dates, errors := libs.GetDatesInRange(request.Filters.DayStart, request.Filters.DayEnd) :97 (0x4e9f12)

c:/go/src/runtime/asm_amd64.s:437 (0x45cc75) call32: CALLFN(·call32, 32)

c:/go/src/reflect/value.go:432 (0x471591) Value.call: call(frametype, fn, args, uint32(frametype.size), uint32(retOffset))

c:/go/src/reflect/value.go:300 (0x470258) Value.Call: return v.call("Call", in)

我应该如何与他们合作,或者如何确定问题出在哪里。这对我来说不是信息性的。


阿晨1998
浏览 235回答 2
2回答

偶然的你

在Go你必须从恐慌中恢复过来,它确实包含了恐慌的错误信息的可能性。恢复后,您可以分析发生恐慌的问题。要从恐慌中恢复,您可以使用defer语句,顾名思义,它会延迟语句的执行。这意味着你可以跳过一些事件来挂断系统,这不是一个很好的解决方案。最好的解决方案是捕获错误并充分处理它们。如果错误发生在某些第三方框架上,则应由其创建者解决。如果不是,您应该检查为什么您的代码会出现恐慌。这是恐慌恢复的代码片段:defer func() {    if err := recover(); err != nil {        fmt.Printf("Recovered from panic. %s", err)    }}()这是一个简单的示例,说明如何在恐慌和恢复方法中使用构建:package mainimport "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 codeif err != nil {    panic(&ParseError{idx, field, err})}// ... some code然后就可以分析 deferred 语句中传入的接口了。阅读这篇文章:https : //github.com/golang/go/wiki/PanicAndRecover

倚天杖

您可以使用这段代码并将其放置在每个函数中defer func() {  if err := recover(); err != nil {    fmt.Println("Panic Occured and Recovered in, Error Info: ", err)  }}()试试这个它会为你工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go