Chyby se stacktrace v #Go

Publikováno 11-03-2016 11:27:03

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:

d 2 C m r r e 0 h a / u / u / f 1 y i U n u n u e 6 b n s t s t s c / a . e i r i r t 1 m r m / m / u 1 s a s e l e l s / e i / . o . o @ 0 n d m c g c s 3 s e a a o a p t f i l e l u 1 a e n / x / t 2 c c C i C n : k t e t e i 2 t u l l k 5 r s l l : a / a a g 0 c p r r o 3 e e / / m r g g $ M s o o á o / / g m n 1 1 o e a . . l 7 7 r t / . . u u s 1 1 n a / / c n l l e h d i i r y p b b r b i e e o u t x x r : / e e s g c c . N o / / g ě / s s o j e r r a r c c k r / / á o r r r u u c s n n h . t t y g i i b o m m a : e e 1 / / 1 p a r s o m c _ . a g m o d : 6 1 4 8 . 3 s : 2 0 8 6 .
comments powered by Disqus