45 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			45 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package utility
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								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) // 执行传入的函数
							 | 
						|||
| 
								 | 
							
									}()
							 | 
						|||
| 
								 | 
							
								}
							 |