43 lines
663 B
Go
43 lines
663 B
Go
package router
|
|
|
|
import (
|
|
"errors"
|
|
"runtime/debug"
|
|
)
|
|
|
|
// StackError 保存原始错误和堆栈
|
|
type StackError struct {
|
|
err error
|
|
stack string
|
|
}
|
|
|
|
// 实现 error 接口
|
|
func (s *StackError) Error() string {
|
|
if s.err == nil {
|
|
return ""
|
|
}
|
|
return s.err.Error()
|
|
}
|
|
|
|
// StackTrace 返回堆栈信息
|
|
func (s *StackError) StackTrace() string {
|
|
return s.stack
|
|
}
|
|
|
|
// WrapWithStack 给错误附加堆栈,如果已经是 StackError 则直接返回
|
|
func WrapWithStack(err error) *StackError {
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
|
|
var se *StackError
|
|
if errors.As(err, &se) {
|
|
return se
|
|
}
|
|
|
|
return &StackError{
|
|
err: err,
|
|
stack: string(debug.Stack()),
|
|
}
|
|
}
|