共计 1379 个字符,预计需要花费 4 分钟才能阅读完成。
序
本文次要钻研一下 golang 的 error 包装
error
type error interface {Error() string | |
} |
error 接口定义了 Error 办法,返回 string
runtime.Error
package runtime | |
type Error interface { | |
error | |
// and perhaps other methods | |
} |
对于 panic,产生的则是 runtime.Error,该接口内嵌了 error 接口
wrap
package main | |
import ( | |
"errors" | |
"fmt" | |
pkgerr "github.com/pkg/errors" | |
) | |
func main() {if err := methodA(false); err != nil {fmt.Printf("%+v", err) | |
} | |
if err := methodA(true); err != nil {fmt.Printf("%+v", err) | |
} | |
} | |
func methodA(wrap bool) error {if err := methodB(wrap); err != nil { | |
if wrap {return pkgerr.Wrap(err, "methodA call methodB error") | |
} | |
return err | |
} | |
return nil | |
} | |
func methodB(wrap bool) error {if err := methodC(); err != nil { | |
if wrap {return pkgerr.Wrap(err, "methodB call methodC error") | |
} | |
return err | |
} | |
return nil | |
} | |
func methodC() error {return errors.New("test error stack") | |
} |
应用内置的 errors,则没方法打印堆栈;应用 pkg/errors 能够携带堆栈
输入
test error stack | |
test error stack | |
methodB call methodC error | |
main.methodB | |
/error-demo/error_wrap.go:33 | |
main.methodA | |
/error-demo/error_wrap.go:21 | |
main.main | |
/error-demo/error_wrap.go:15 | |
runtime.main | |
/usr/local/go/src/runtime/proc.go:204 | |
runtime.goexit | |
/usr/local/go/src/runtime/asm_amd64.s:1374 | |
methodA call methodB error | |
main.methodA | |
/error-demo/error_wrap.go:23 | |
main.main | |
/error-demo/error_wrap.go:15 | |
runtime.main | |
/usr/local/go/src/runtime/proc.go:204 | |
runtime.goexit | |
/usr/local/go/src/runtime/asm_amd64.s:1374% |
小结
- error 接口定义了 Error 办法,返回 string;对于 panic,产生的则是 runtime.Error,该接口内嵌了 error 接口
- 应用内置的 errors,则没方法打印堆栈;应用 pkg/errors 能够携带堆栈
doc
- Errors
- pkg/errors
- Embedding Interfaces in Go (Golang)
正文完