Go-micro异常捕获

Go-micro异常捕获

go-micro服务层,添加异常捕获机制,并发送报警。
本文提供的只是一种捕获异常的思路:通过添加Handler实现。

1.注入拦截器

初始化时,添加异常捕获Handler。
部分代码

...
//初始化服务
config.Service = grpc.NewService(
	micro.Name("MyService"),
	micro.Address(...),
	// 添加异常拦截
	micro.WrapHandler(utils.WxErrorHandler()),
)
...

2.拦截器

utils
|—errorHandler.go

/**
 * @Description: 异常拦截器
 * @return server.HandlerWrapper
 */
func WxErrorHandler() server.HandlerWrapper {
    
    
	return func(h server.HandlerFunc) server.HandlerFunc {
    
    
		return func(ctx context.Context, req server.Request, rsp interface{
    
    }) error {
    
    
			defer func() {
    
    
				// 如果是崩溃导致的信号,发送报警
				err := recover()
				if err != nil {
    
    
				// 捕获后处理
					errorMsg := PanicTrace(1)
					.....
				}
			}()
			return h(ctx, req, rsp)
		}
	}
}

/**
 * @Description: 获取当前堆栈信息
 * @param kb 大小
 * @return string 堆栈信息
 */
func PanicTrace(kb int) string {
    
    
	s := []byte("/src/runtime/panic.go")
	e := []byte("\ngoroutine ")
	line := []byte("\n")
	stack := make([]byte, kb<<10) //4KB
	length := runtime.Stack(stack, true)
	start := bytes.Index(stack, s)
	stack = stack[start:length]
	start = bytes.Index(stack, line) + 1
	stack = stack[start:]
	end := bytes.LastIndex(stack, line)
	if end != -1 {
    
    
		stack = stack[:end]
	}
	end = bytes.Index(stack, e)
	if end != -1 {
    
    
		stack = stack[:end]
	}
	stack = bytes.TrimRight(stack, "\n")
	return string(stack)
}

猜你喜欢

转载自blog.csdn.net/LitongZero/article/details/110125269