猿问

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

我能够用juju/errors打印错误的行号,但不知道如何用pkg/errors做同样的事情。


package main


import (

    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 directory

go-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


慕少森
浏览 180回答 1
1回答

ibeautiful

使用默认方法时,来自的错误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:// whoopsfmt.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 mainimport (    "fmt"    "github.com/pkg/errors")func main() {    err := errors.New("whoops")    fmt.Printf("String: %s\n", err)    fmt.Printf("Verbose: %+v\n", err)}输出:String: whoopsVerbose: whoopsmain.main    /tmp/sandbox878560423/prog.go:10runtime.main    /usr/local/go-faketime/src/runtime/proc.go:204runtime.goexit    /usr/local/go-faketime/src/runtime/asm_amd64.s:1374
随时随地看视频慕课网APP

相关分类

Go
我要回答