为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 go 中使用 pkg/errors 打印错误行号?

如何在 go 中使用 pkg/errors 打印错误行号?

Go
慕少森 2022-06-27 11:18:59
我能够用juju/errors打印错误的行号,但不知道如何用pkg/errors做同样的事情。package mainimport (    jerrors "github.com/juju/errors"    perrors "github.com/pkg/errors"    "io/ioutil"    "log")func jerror() error {    //throw an error....    _, err := ioutil.ReadDir("r")    if err != nil {        return jerrors.Trace(err)    }    return nil}func perror() error {    //throw an error....    _, err := ioutil.ReadDir("r")    if err != nil {        return perrors.Cause(err)    }    return nil}func main() {    jerr := jerror()    if jerr != nil {        log.Println(jerrors.ErrorStack(jerr))    }    log.Println("-------------------------")    perr := perror()    if perr != nil {        log.Println(perrors.WithStack(perr))    }}打印出来:2020/08/26 00:19:48 open r: no such file or directorygo-mock-json-api/main.go:15: 2020/08/26 00:19:48 -------------------------2020/08/26 00:19:48 open r: no such file or directory
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

使用默认方法时,来自的错误pkg/errors不会打印堆栈,而是使用打印它。String()"%+v"


这在文档的格式化打印错误部分中进行了解释:


从这个包返回的所有错误值都实现了 fmt.Formatter 并且可以被 fmt 包格式化。支持以下动词:


%s    print the error. If the error has a Cause it will be

      printed recursively.

%v    see %s

%+v   extended format. Each Frame of the error's StackTrace will

      be printed in detail.

WithStack的文档有显示不同行为的示例:


cause := errors.New("whoops")

err := errors.WithStack(cause)

fmt.Println(err)


// Output:

// whoops


fmt.Printf("%+v", err)


// Output:

// whoops

// github.com/pkg/errors_test.ExampleWithStack_printf

//         /home/fabstu/go/src/github.com/pkg/errors/example_test.go:55

// testing.runExample

// ...

请注意,如果您直接使用errors.New,则不需要使用WithStack,errors.New已经为您完成了,如本操场示例所示:


package main


import (

    "fmt"


    "github.com/pkg/errors"

)


func main() {

    err := errors.New("whoops")

    fmt.Printf("String: %s\n", err)

    fmt.Printf("Verbose: %+v\n", err)


}

输出:


String: whoops

Verbose: whoops

main.main

    /tmp/sandbox878560423/prog.go:10

runtime.main

    /usr/local/go-faketime/src/runtime/proc.go:204

runtime.goexit

    /usr/local/go-faketime/src/runtime/asm_amd64.s:1374


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信