github.com/GuanceCloud/cliutils@v1.1.21/system/rtpanic/rtpanic.go (about) 1 // Unless explicitly stated otherwise all files in this repository are licensed 2 // under the MIT License. 3 // This product includes software developed at Guance Cloud (https://www.guance.com/). 4 // Copyright 2021-present Guance, Inc. 5 6 // Package rtpanic wraps panic handling during golang app panic. 7 package rtpanic 8 9 import ( 10 "runtime" 11 ) 12 13 const ( 14 StackTraceSize = 4096 15 ) 16 17 type RecoverCallback func(info []byte, err error) 18 19 // Recover used to hook a on-panic-function. 20 // @RecoverCallback: 复活函数, 即如果某个 goroutine panic 后, 可以指定某个函数, 继续复活该 goroutine 21 // @cleanupCallback: 清理/善后回调函数, 比如上报 panic 信息, 现场清理等等 22 // TRICK: 尽量将这些回调定义成本地函数, 这样便于处理现场, 比如 recoverCallback:. 23 func Recover(recoverCallback, cleanupCallback RecoverCallback) { 24 r := recover() 25 26 // 通过判断 recover() 的返回情况, 确定 goroutine 是正常退出还是被 panic 了 27 if err, ok := r.(error); ok { 28 buf := make([]byte, StackTraceSize) 29 runtime.Stack(buf, false) 30 31 if cleanupCallback != nil { 32 cleanupCallback(buf, err) 33 } 34 35 if recoverCallback != nil { 36 recoverCallback(buf, err) // 将 panic 信息回送给复活函数处理 37 } 38 } 39 }