如何实现堆栈跟踪?

huangapple go评论123阅读模式
英文:

How to implement stack tracing?

问题

我正在尝试实现堆栈错误追踪。我在追踪错误时遇到了困难。以下代码捕获了数据库错误,但没有追踪错误:

  1. // err 表示 *db.Error
  2. if err != nil {
  3. return nil, errors.Wrap(err, "error msg")
  4. }
  5. // 现在,在错误中间件中:
  6. func traceError(err error) {
  7. _, ok := err.(stackTracer)
  8. if ok {
  9. fmt.Print("tracer implemented")
  10. } else {
  11. fmt.Print("tracer not implemented")
  12. }
  13. }
  14. switch e := errors.Cause(err).(type) {
  15. case *db.Error:
  16. fmt.Print("caught db error")
  17. traceError(err)
  18. default:
  19. fmt.Print("unknown error")
  20. traceError(err)
  21. }

输出结果:

  1. caught db error
  2. tracer not implemented

当我创建新的错误时,追踪被实现了:

  1. // err 表示 *db.Error
  2. if err != nil {
  3. newError := errors.New(err.Error())
  4. return nil, errors.Wrap(newError, "error msg")
  5. }

输出结果:

  1. unknown error
  2. tracer implemented

我期望的输出是:

  1. caught db error
  2. tracer implemented

编辑: 重新查看后,我发现我的代码运行正常。可能是我在代码的某个地方搞错了什么。

英文:

I am trying to implement stack error tracing. I am having difficulty tracing the error. The following code catches the db error. But it doesn’t trace the error:

  1. // err represents *db.Error
  2. if err != nil {
  3. return nil, errors.Wrap(err, "error msg")
  4. }
  5. // Now, in the error middleware:
  6. func traceError(err error) {
  7. _, ok := err.(stackTracer)
  8. if ok {
  9. fmt.Print("tracer implemented")
  10. } else {
  11. fmt.Print("tracer not implemented")
  12. }
  13. }
  14. switch e := errors.Cause(err).(type) {
  15. case *db.Error:
  16. fmt.Print("caught db error")
  17. traceError(err)
  18. defaut:
  19. fmt.Print("unknown error")
  20. traceError(err)
  21. }

Outputs:

  1. caught db error
  2. tracer not implemented

When I create new error the trace is implemented:

  1. // err represents *db.Error
  2. if err != nil {
  3. newError := errors.New(err.Error())
  4. return nil, errors.Wrap(newError, "error msg")
  5. }

Outputs:

  1. unknown error
  2. tracer implemented

My desired output is:

  1. caught db error
  2. tracer implemented

Edit: After re-looking I found my code is working fine. I might have messed something somewhere in my code.

答案1

得分: 2

刚刚注意到问题中提到了github.com/pkg/errors包。除了问题中的一些语法错误外,它按预期工作:

  1. package main
  2. import (
  3. "fmt"
  4. "io/fs"
  5. "os"
  6. "github.com/pkg/errors"
  7. )
  8. func fn() error {
  9. _, err := os.Open("non-existing")
  10. if err != nil {
  11. return errors.Wrap(err, "fn")
  12. }
  13. return nil
  14. }
  15. type stackTracer interface {
  16. StackTrace() errors.StackTrace
  17. }
  18. func traceError(err error) {
  19. _, ok := err.(stackTracer)
  20. if ok {
  21. fmt.Println("tracer implemented")
  22. } else {
  23. fmt.Println("tracer not implemented")
  24. }
  25. }
  26. func main() {
  27. err := fn()
  28. switch e := errors.Cause(err); e.(type) {
  29. case *fs.PathError:
  30. fmt.Println("caught fs error")
  31. traceError(err)
  32. default:
  33. fmt.Println("unknown error")
  34. traceError(err)
  35. }
  36. }

输出结果为:

  1. caught fs error
  2. tracer implemented
英文:

Just noticed that the question is talking about the package github.com/pkg/errors. Except for some syntax error in the question, it works as expected:

  1. package main
  2. import (
  3. "fmt"
  4. "io/fs"
  5. "os"
  6. "github.com/pkg/errors"
  7. )
  8. func fn() error {
  9. _, err := os.Open("non-existing")
  10. if err != nil {
  11. return errors.Wrap(err, "fn")
  12. }
  13. return nil
  14. }
  15. type stackTracer interface {
  16. StackTrace() errors.StackTrace
  17. }
  18. func traceError(err error) {
  19. _, ok := err.(stackTracer)
  20. if ok {
  21. fmt.Println("tracer implemented")
  22. } else {
  23. fmt.Println("tracer not implemented")
  24. }
  25. }
  26. func main() {
  27. err := fn()
  28. switch e := errors.Cause(err); e.(type) {
  29. case *fs.PathError:
  30. fmt.Println("caught fs error")
  31. traceError(err)
  32. default:
  33. fmt.Println("unknown error")
  34. traceError(err)
  35. }
  36. }

The output is:

  1. caught fs error
  2. tracer implemented

huangapple
  • 本文由 发表于 2023年5月3日 17:13:38
  • 转载请务必保留本文链接:https://go.coder-hub.com/76162208.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定