golang 异常处理

背景

很多语言java php 等异常可以打印出异常的具体的信息 堆栈 文件行号 异常原因
但是golang 需要自己去不是方便 是不是也可以做到 行号 具体的信息呢
答案是可以的

查阅

  • golang 提供单个API
    • debug.Stack()
    • fmt.Errorf
    • struct 实现 func Error() string && func Unwrap() error
  • 判断方式
    • errors.Is
    • errors.As

代码

  • painc
defer func() {
  if r := recover(); r != nil {
   err := fmt.Errorf("%s goroutine panic: \n%s\n",
    time.Now(), string(debug.Stack()))
   log.WithError(err).Error("sync panic recovery")
   go s.SaveErrLog(profile, err, oneStart)
  }
 }()
  • fmt.Errorf
err1 := errors.New("new error")
err2 := fmt.Errorf("err2: [%w]", err1)
err3 := fmt.Errorf("err3: [%w]", err2)
fmt.Println(err3)
  • strcut error
type WarpError struct {
    msg string
    err error
}

func (e *WarpError) Error() string {
    return e.msg
}

func (e *WrapError) Unwrap() error {
    return e.err
}
  • error.Is
err1 := errors.New("new error")
err2 := fmt.Errorf("err2: [%w]", err1)
err3 := fmt.Errorf("err3: [%w]", err2)

fmt.Println(errors.Is(err3, err2))
fmt.Println(errors.Is(err3, err1))
  • error.AS
type ErrorString struct {
    s string
}

func (e *ErrorString) Error() string {
    return e.s
}

var targetErr *ErrorString
err := fmt.Errorf("new error:[%w]", &ErrorString{s:"target err"})
fmt.Println(errors.As(err, &targetErr))
posted @ 2022-04-13 14:07  vx_guanchaoguo0  阅读(29)  评论(0编辑  收藏  举报