diff --git a/config.go b/config.go index effc5e12..a4f40611 100644 --- a/config.go +++ b/config.go @@ -19,9 +19,11 @@ import ( "os" "path/filepath" "reflect" + "runtime" "strings" "github.com/astaxie/beego/config" + "github.com/astaxie/beego/context" "github.com/astaxie/beego/logs" "github.com/astaxie/beego/session" "github.com/astaxie/beego/utils" @@ -34,6 +36,7 @@ type Config struct { RouterCaseSensitive bool ServerName string RecoverPanic bool + RecoverFunc func(*context.Context) CopyRequestBody bool EnableGzip bool MaxMemory int64 @@ -142,6 +145,37 @@ func init() { } } +func recoverPanic(ctx *context.Context) { + if err := recover(); err != nil { + if err == ErrAbort { + return + } + if !BConfig.RecoverPanic { + panic(err) + } + if BConfig.EnableErrorsShow { + if _, ok := ErrorMaps[fmt.Sprint(err)]; ok { + exception(fmt.Sprint(err), ctx) + return + } + } + var stack string + logs.Critical("the request url is ", ctx.Input.URL()) + logs.Critical("Handler crashed with error", err) + for i := 1; ; i++ { + _, file, line, ok := runtime.Caller(i) + if !ok { + break + } + logs.Critical(fmt.Sprintf("%s:%d", file, line)) + stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d", file, line)) + } + if BConfig.RunMode == DEV { + showErr(err, ctx, stack) + } + } +} + func newBConfig() *Config { return &Config{ AppName: "beego", @@ -149,6 +183,7 @@ func newBConfig() *Config { RouterCaseSensitive: true, ServerName: "beegoServer:" + VERSION, RecoverPanic: true, + RecoverFunc: recoverPanic, CopyRequestBody: false, EnableGzip: false, MaxMemory: 1 << 26, //64MB diff --git a/router.go b/router.go index f528509d..835b10b2 100644 --- a/router.go +++ b/router.go @@ -626,7 +626,9 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request) context.Reset(rw, r) defer p.pool.Put(context) - defer p.recoverPanic(context) + if BConfig.RecoverFunc != nil { + defer BConfig.RecoverFunc(context) + } context.Output.EnableGzip = BConfig.EnableGzip @@ -878,37 +880,6 @@ func (p *ControllerRegister) FindRouter(context *beecontext.Context) (routerInfo return } -func (p *ControllerRegister) recoverPanic(context *beecontext.Context) { - if err := recover(); err != nil { - if err == ErrAbort { - return - } - if !BConfig.RecoverPanic { - panic(err) - } - if BConfig.EnableErrorsShow { - if _, ok := ErrorMaps[fmt.Sprint(err)]; ok { - exception(fmt.Sprint(err), context) - return - } - } - var stack string - logs.Critical("the request url is ", context.Input.URL()) - logs.Critical("Handler crashed with error", err) - for i := 1; ; i++ { - _, file, line, ok := runtime.Caller(i) - if !ok { - break - } - logs.Critical(fmt.Sprintf("%s:%d", file, line)) - stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d", file, line)) - } - if BConfig.RunMode == DEV { - showErr(err, context, stack) - } - } -} - func toURL(params map[string]string) string { if len(params) == 0 { return ""