douping7105 2016-02-11 13:01
浏览 59
已采纳

前往:恐慌处理或发生了什么

I'm rather new in Go, and can't understand what is the best way to handle panics. I can write my own panic("bad data or empty source") and I'll detetrmine on the output that code fails on this exactly place, but what to do with the panic's that are generated in not mine methods.

Now I have such an error :

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)
C:/gocode/src/github.com/revel/revel/invoker.go:36 (0x496e51) ActionInvoker: resultValue = methodValue.Call(methodArgs)[0]
C:/gocode/src/github.com/revel/revel/compress.go:47 (0x487f89) CompressFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/intercept.go:103 (0x4954b9) InterceptorFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/oculus/rest/app/init.go:37 (0x4e2366) glob.func1: fc[0](c, fc[1:]) // Execute the next filter stage.
C:/gocode/src/github.com/revel/revel/i18n.go:155 (0x4947a3) I18nFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/validation.go:191 (0x4ae27d) ValidationFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/flash.go:46 (0x490ee7) FlashFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/session.go:149 (0x4a914c) SessionFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/params.go:133 (0x499116) ParamsFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/filterconfig.go:208 (0x490a64) FilterConfiguringFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/router.go:474 (0x4a61e6) RouterFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/panic.go:15 (0x4972c8) PanicFilter: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/watcher.go:232 (0x4b512d) glob.func31: fc[0](c, fc[1:])
C:/gocode/src/github.com/revel/revel/server.go:50 (0x4a6d95) handleInternal: Filters[0](c, Filters[1:])
C:/gocode/src/github.com/revel/revel/server.go:38 (0x4a68f6) handle: handleInternal(w, r, nil)
c:/go/src/net/http/server.go:1422 (0x57cfe1) HandlerFunc.ServeHTTP: f(w, r)
c:/go/src/net/http/server.go:1862 (0x57f285) serverHandler.ServeHTTP: handler.ServeHTTP(rw, req)
c:/go/src/net/http/server.go:1361 (0x57ca85) (*conn).serve: serverHandler{c.server}.ServeHTTP(w, w.req)
c:/go/src/runtime/asm_amd64.s:1721 (0x45f121) goexit: BYTE  $0x90   // NOP

How should I work with them, or how to determine where is the trouble. this is not enformative for me for this time.

  • 写回答

2条回答 默认 最新

  • doupai8095 2016-02-11 13:19
    关注

    In Go you have the possibility to recover from panic, which does contain the panic error message. After recovering you may analyze the issue why the panic is happening. To recover from panic you can use the defer statement which as the name implies, defers execution of the statement. This means that you can skip some events to hang up the system, which is not quite a good solution. The best solution is to capture the errors and handle them adequately. If the error happens on some third party framework this should be addressed by their creators. If not you should check why your code is panicking.

    Here a code snippet for panic recover:

    defer func() {
        if err := recover(); err != nil {
            fmt.Printf("Recovered from panic. %s", err)
        }
    }()
    

    And here is a simple example of how you can use the build in panic and recovery methods:

    package main
    
    import "fmt"
    
    func badCall() {
        panic("Bad call happend!")
    }
    
    func test() {
        defer func() {
            if err := recover(); err != nil {
                fmt.Printf("Panicking %s
    " , 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

    If recover is called inside a deferred function, the stack stops unwinding and recover returns the value (as an interface{}!) that was passed to panic. This means that you can pass an interface as an argument to the panic method, like:

    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
    

    Then you can analyze the passed interface in the deferred statement.

    Read this article: https://github.com/golang/go/wiki/PanicAndRecover

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误