Go 异常捕获处理: panic(err) 与 recover()
生活随笔
收集整理的這篇文章主要介紹了
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() anyruntime.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 := 0if 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 = 1g0.writebuf = buf[0:0:len(buf)]goroutineheader(gp)traceback(pc, sp, 0, gp)if all {tracebackothers(gp)}g0.m.traceback = 0n = len(g0.writebuf)g0.writebuf = nil})}if all {startTheWorld()}return n }總結
以上是生活随笔為你收集整理的Go 异常捕获处理: panic(err) 与 recover()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库学习(十)— 查询演练
- 下一篇: Photoshop+Lightroom数