package module
Version: v0.0.0-...-5a1027f Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Mar 10, 2016 License: MIT Imports: 3 Imported by: 0


Error Wrapper

GoDoc Codeship Codecov Go Report Card

Error Wrapper creates an wrapper for the error type in Go which captures the File, Line and Stack of where it was called.


go get -u github.com/txgruppi/werr


I don't like to use panic.

I want my apps to run forever and just output errors to a log.

Usually I write my logs using logger.Printf("%#v", err) but I needed more info related to the error, so I created this package.


package main

import (


func main() {
	file, err := os.Open("/tmp/my-missing-file")
	if err != nil {
		err = werr.Wrap(err)                        // Wrap it
		fmt.Println(err.Error())                    // Return the original error message
		if wrapped, ok := err.(*werr.Wrapper); ok { // Try to convert to `*werr.Wrapper`
			lg, _ := wrapped.Log() // Generate the log message
			fmt.Println(lg)        // Print the log message
	defer file.Close()

This code will output something line this:

open /tmp/my-missing-file: no such file or directory
/Users/txgruppi/code/temp/test.go:13 open /tmp/my-missing-file: no such file or directory
goroutine 1 [running]:
github.com/txgruppi/werr.Wrap(0x2208246900, 0x208270300, 0x0, 0x0)
        /Users/txgruppi/code/go/src/github.com/txgruppi/werr/funcs.go:24 +0x153
        /Users/txgruppi/code/temp/test.go:13 +0x72


go get -u -t github.com/txgruppi/werr
cd $GOPATH/src/github.com/txgruppi/werr
go test ./...






This section is empty.


View Source
var (
	// StackArraySize defines the number of bytes which will be allocated for the
	// stack trace.
	// Any value `<= 0` will result in not creating the stack trace.
	StackArraySize = 512

	// LogLine is the format used by `*Wrapper.Log()`.
	// It should be a valid `text/template` string.
	// The data passed to the `Execute` method of the template is the `*Wrapper`
	// instance, which means that you can use all `*Wrapper` methods and
	// attributes inside the template.
	LogLine = "{{.File}}:{{.Line}} {{.Original.Error}}\n{{printf \"%s\" .Stack}}\n\n"


func Unwrap

func Unwrap(err error) error

Unwrap returns the original error inside an `*Wrapper` instance. If `err` is `nil` it will return `nil`. If `err` is an instance of `*Wrapper` it will return the value of the `Original` attribute. Anything else will be returned without any modification.

func Wrap

func Wrap(err error) error

Wrap creates an `*Wrapper` instance with the file, line and stack trace of the moment when it is called. If `StackArraySize` is `<= 0` the stack trace will not be generated. If `err` is `nil` it will return `nil`. If `err` is an `*Wrapper` it will return the same `err` variable. Anything else will be put in the `Original` attribute of `*Wrapper`


type Wrapper

type Wrapper struct {
	Original error
	File     string
	Line     int
	Stack    []byte

Wrapper is the struct which holds the `Original` error and the data related to this error. You should not create an instance of `*Wrapper` by yourself, you should call the `Wrap` function, which will set all the values for you automatically.

func (*Wrapper) Error

func (w *Wrapper) Error() string

func (*Wrapper) Log

func (w *Wrapper) Log() (string, error)

Log returns an string which is created by `LogLine` execution. If can return an error if any template-related function returns an error.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL