Go 异常捕获处理: panic(err) 与 recover()
Posted 禅与计算机程序设计艺术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 异常捕获处理: panic(err) 与 recover()相关的知识,希望对你有一定的参考价值。
代码实例
func (rcvr *CQL) Compile(ctx context.Context) string
defer func()
if err := recover(); err != nil
//打印调用栈信息
buf := make([]byte, 2048)
n := runtime.Stack(buf, false)
stackInfo := fmt.Sprintf("%s", buf[:n])
logu.CtxError(ctx, error_code.ProcessError, "Compile", "[FillStructInfo] rcvr=%v, resultRecord=%v, panic recovered: \\n%v\\n%v", convert.ToJSONString(rcvr), err, stackInfo)
()
return rcvr.compile1()
panic / recover 源码注释
// The panic built-in function stops normal execution of the current
// goroutine. When a function F calls panic, normal execution of F stops
// immediately. Any functions whose execution was deferred by F are run in
// the usual way, and then F returns to its caller. To the caller G, the
// invocation of F then behaves like a call to panic, terminating G's
// execution and running any deferred functions. This continues until all
// functions in the executing goroutine have stopped, in reverse order. At
// that point, the program is terminated with a non-zero exit code. This
// termination sequence is called panicking and can be controlled by the
// built-in function recover.
func panic(v any)
// The recover built-in function allows a program to manage behavior of a
// panicking goroutine. Executing a call to recover inside a deferred
// function (but not any function called by it) stops the panicking sequence
// by restoring normal execution and retrieves the error value passed to the
// call of panic. If recover is called outside the deferred function it will
// not stop a panicking sequence. In this case, or when the goroutine is not
// panicking, or if the argument supplied to panic was nil, recover returns
// nil. Thus the return value from recover reports whether the goroutine is
// panicking.
func recover() any
runtime.Stack(buf []byte, all bool) int
// Stack formats a stack trace of the calling goroutine into buf
// and returns the number of bytes written to buf.
// If all is true, Stack formats stack traces of all other goroutines
// into buf after the trace for the current goroutine.
func Stack(buf []byte, all bool) int
if all
stopTheWorld("stack trace")
n := 0
if len(buf) > 0
gp := getg()
sp := getcallersp()
pc := getcallerpc()
systemstack(func()
g0 := getg()
// Force traceback=1 to override GOTRACEBACK setting,
// so that Stack's results are consistent.
// GOTRACEBACK is only about crash dumps.
g0.m.traceback = 1
g0.writebuf = buf[0:0:len(buf)]
goroutineheader(gp)
traceback(pc, sp, 0, gp)
if all
tracebackothers(gp)
g0.m.traceback = 0
n = len(g0.writebuf)
g0.writebuf = nil
)
if all
startTheWorld()
return n
以上是关于Go 异常捕获处理: panic(err) 与 recover()的主要内容,如果未能解决你的问题,请参考以下文章