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()的主要内容,如果未能解决你的问题,请参考以下文章

Go中的错误处理

Go语言之Go语言 异常处理与测试

GO语言异常处理机制panic和recover分析

Go语言圣经-Panic异常,Recover捕获异常习题

go的异常处理,defer,panic,recover

Go 手动打造一个简易版的 try cache