45 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package helper
 | ||
| 
 | ||
| import (
 | ||
| 	"fmt"
 | ||
| 	"runtime"
 | ||
| 	"runtime/debug"
 | ||
| 	"strings"
 | ||
| 
 | ||
| 	"github.com/go-admin-team/go-admin-core/logger"
 | ||
| )
 | ||
| 
 | ||
| // SafeGo 安全地启动一个 goroutine,捕获 panic
 | ||
| func SafeGo(fn func()) {
 | ||
| 	go func() {
 | ||
| 		defer func() {
 | ||
| 			if r := recover(); r != nil {
 | ||
| 				// 记录 Goroutine ID、panic 信息和堆栈
 | ||
| 				logger.Error(fmt.Sprintf("Recovered from panic in Goroutine %s: %v\nStack Trace:\n%s", GetGoroutineID(), r, string(debug.Stack())))
 | ||
| 			}
 | ||
| 		}()
 | ||
| 		fn()
 | ||
| 	}()
 | ||
| }
 | ||
| 
 | ||
| // 获取 Goroutine ID
 | ||
| func GetGoroutineID() string {
 | ||
| 	buf := make([]byte, 64)
 | ||
| 	n := runtime.Stack(buf, false)
 | ||
| 	stack := string(buf[:n])
 | ||
| 	// 提取 Goroutine ID
 | ||
| 	id := strings.Split(stack, " ")[1]
 | ||
| 	return id
 | ||
| }
 | ||
| 
 | ||
| func SafeGoParam[T any](fn func(T), param T) {
 | ||
| 	go func() {
 | ||
| 		defer func() {
 | ||
| 			if r := recover(); r != nil {
 | ||
| 				logger.Error(fmt.Sprintf(" SafeGoParam Recovered from panic in Goroutine %s: %v\nStack Trace:\n%s", GetGoroutineID(), r, string(debug.Stack())))
 | ||
| 			}
 | ||
| 		}()
 | ||
| 		fn(param) // 执行传入的函数
 | ||
| 	}()
 | ||
| }
 |