1. package main
    2. import (
    3. "database/sql"
    4. "github.com/pkg/errors"
    5. "log"
    6. "net/http"
    7. )
    8. const DataNotFound = 10001 // 数据不存在
    9. type MyError struct {
    10. Message string
    11. Code int
    12. Err error
    13. }
    14. func GetSql() error {
    15. return errors.Wrap(sql.ErrNoRows, "data not found")
    16. //return errors.WithStack(sql.ErrNoRows)
    17. }
    18. func Call() error {
    19. return errors.WithMessage(GetSql(), "data not found")
    20. }
    21. func GetSqlNoErr() MyError {
    22. // 伪造错误
    23. err := sql.ErrNoRows
    24. myMsg := MyError{
    25. Err: nil,
    26. Message: "ok",
    27. Code: http.StatusOK,
    28. }
    29. if errors.Is(err, sql.ErrNoRows) {
    30. myMsg.Err = err
    31. myMsg.Code = DataNotFound
    32. myMsg.Message = "data not found"
    33. }
    34. return myMsg
    35. }
    36. func main() {
    37. //err := Call()
    38. //if errors.Cause(err) == sql.ErrNoRows {
    39. // // 打印堆栈信息
    40. // fmt.Printf("data not found, %v\n", err)
    41. // fmt.Printf("%+v\n", err)
    42. // return
    43. //}
    44. //if err != nil {
    45. // // unknown error
    46. //}
    47. err := GetSqlNoErr()
    48. if err.Code == DataNotFound {
    49. log.Fatal(err.Message)
    50. }
    51. }