Advanced error handling for Go
Go to file
2020-09-09 13:34:23 +02:00
calltrace.go initial commit 2020-09-09 11:48:46 +02:00
doc.go initial commit 2020-09-09 11:48:46 +02:00
error_test.go initial commit 2020-09-09 11:48:46 +02:00
error_tmpl_test.go initial commit 2020-09-09 11:48:46 +02:00
error_tmpl.go initial commit 2020-09-09 11:48:46 +02:00
error.go added README.md once again 2020-09-09 13:34:23 +02:00
globals.go initial commit 2020-09-09 11:48:46 +02:00
go.mod made go module 2020-09-09 11:57:48 +02:00
README.md added README.md once again 2020-09-09 13:34:23 +02:00
utils.go initial commit 2020-09-09 11:48:46 +02:00

adverr

Package adverr implements errors with call stack traces as well as error templates for error equality

Installation

go get git.tordarus.net/tordarus/adverr

Usage examples

Importing

import "git.tordarus.net/tordarus/adverr"

Creating error templates

var (
    ErrDoStuffFailed = adverr.NewErrTmpl("ErrDoStuffFailed", "Could'nt do stuff because of %s")
)

Creating independent error (without error template)

func doStuffWithIndependentErr() error {
    return adverr.New("Could'nt do stuff")
}

Creating error based on template

func doStuff() error {
    return ErrDoStuffFailed.New("reasons")
}

Printing errors on stderr convieniently

adverr.Print(myErr)
adverr.Println(myErr)

Printing errors on stderr and exit with exit code

adverr.Fatal(myErr, 1)
adverr.Fatalln(myErr, 1)

Advantages of error templates

two errors made by the same template will return true when called with errors.Is()

func doStuffAndFailWithMsg(msg string) error {
    return ErrDoStuffFailed.New(msg)
}

err1 := doStuffAndFailWithMsg("err1")
err2 := doStuffAndFailWithMsg("err2")

fmt.Println(errors.Is(err1, err2))          // true
fmt.Println(err1 == err2)                   // false
fmt.Println(err1.Error() == err2.Error())   // false

Wrapping errors

By wrapping errors, you can provide an error that is caused by another error. A 'Caused by' section will be printed in the stack trace showing the original error. You can also retrieve the original error by using errors.Unwrap()

func doStuffWrapped() error {
    err := doStuff()
    if err != nil {
        return adverr.Wrap("doStuffWrapped failed", err)
    }

    return nil
}

Retrieving call stack trace (for debugging purposes)

fmt.Println(adverr.Trace())