Snad každý kdo přichází do světa Go ze světa Javy se diví, proč chyby v Go nemají stacktrace. Vždyť přeci chci vědět kde se chyba stala. A mají pravdu, standardní chyby v Go stacktrace nemají. Ale to není proto, že by autoři Go byli snad sadisti, co se vyžívají ve zmatení uživatelů jazyka. Je to proto, že v Go jsou chyby jen interfacy. Tzn. cokoliv co implementuje interface error
je automaticky chybou. A vzhledem k tomu, že interface error
má jen jednu funkci Error() string
, tak je jeho implementace více než jednoduchá.
Většina lidí ze začátku používá běžné errors.New()
, nebo fmt.Errorf()
. Ty vám vrátí instanci errorString
, který obsahuje jen a jen řetězec. Ten samozřejmě žádný stacktrace nemá. Tedy pokud byste ho tam nedali sami, nějak.
Mnohem zajímavější volbou se jeví github.com/pkg/errors
. Tato package umí dvě základní věci. Když si vytvoříte novou chybu, tak vám k ní “přibalí” stackstrace a pokud už pracujete s jinou chybou, tak jí umí “obalit” a přidat stacktrace.
import "errors"
err:= errors.New("Nějaká chyba")
Toto je běžná chyba. Obalíme jí tedy, aby měla i stacktrace.
import "errors"
import errors2 "github.com/pkg/errors"
err:= errors.New("Nějaká chyba")
err= errors2.Wrap(err, "Chyba se stacktracem")
A můžeme si chybu hezky vytisknout.
package main
import (
"errors"
"log"
errors2 "github.com/pkg/errors"
)
func main() {
err := errors.New("Nějaká chyba")
err = errors2.Wrap(err, "Chyba se stacktracem")
log.Printf("Máme tu chybu: %+v.", err) // `%+v` je důležité!
}
A takhle vypadá výstup: