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))
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16139957.html