Skip to content

psi59/errors

Repository files navigation

Errors

This package is inspired by the github.com/pkg/errors package and provides simple error handling primitives and stack trace functionality in Go. It allows you to add context to errors, wrap errors with additional information, and retrieve stack traces for better debugging and error reporting.

Introduction

The traditional error handling idiom in Go is roughly akin to:

if err != nil {
    return err
}

However, this approach can result in errors being reported without sufficient context or debugging information. The custom error package addresses this issue by providing functions and types that allow you to add context to errors and retrieve stack traces.

Features

  • Create new errors with New and Errorf functions.
  • Wrap errors with additional context using Wrap, Wrapf, and WrapWithCause functions.
  • Format errors with stack traces using %+v verb in fmt package.
  • Compatible with errors, github.com/pkg/errors package.

Installation

To use this package in your Go project, you can install it using go get:

go get github.com/psi59/errors

Usage

Here are some examples of how to use the custom error package:

Creating New Errors

err := errors.New("something went wrong")

Wrapping Errors

err := someFunction()
if err != nil {
    return errors.Wrap(err, "failed to do something")
}

Retrieving Stack Traces

err := someFunction()
if err != nil {
    fmt.Printf("%+v\n", err)
}

Formatting Errors with Stack Traces

err := someFunction()
if err != nil {
    fmt.Printf("%+v\n", err)
}

Output:

failed to do something: original error
	at github.com/psi59/main.someFunction(something.go:57)
	at github.com/psi59/main.someFunction(something.go:56)
	at github.com/psi59/main.someFunction(something.go:55)

Benchmark

goos: darwin
goarch: arm64
pkg: github.com/psi59/errors
BenchmarkErrors
BenchmarkErrors/pkg/errors-stack-10
BenchmarkErrors/pkg/errors-stack-10-10         	 3084790	       382.7 ns/op	     312 B/op	       6 allocs/op
BenchmarkErrors/errors-stack-10
BenchmarkErrors/errors-stack-10-10             	42213016	        27.86 ns/op	      16 B/op	       1 allocs/op
BenchmarkErrors/pkg/errors-stack-100
BenchmarkErrors/pkg/errors-stack-100-10        	 1219909	       979.6 ns/op	     312 B/op	       6 allocs/op
BenchmarkErrors/errors-stack-100
BenchmarkErrors/errors-stack-100-10            	 1922048	       622.1 ns/op	      16 B/op	       1 allocs/op
BenchmarkErrors/pkg/errors-stack-1000
BenchmarkErrors/pkg/errors-stack-1000-10       	  187238	      6383 ns/op	     312 B/op	       6 allocs/op
BenchmarkErrors/errors-stack-1000
BenchmarkErrors/errors-stack-1000-10           	  200432	      6013 ns/op	      16 B/op	       1 allocs/op
BenchmarkStackFormatting
BenchmarkStackFormatting/%s-stack-10
BenchmarkStackFormatting/%s-stack-10-10        	19674388	        60.12 ns/op	       8 B/op	       1 allocs/op
BenchmarkStackFormatting/%v-stack-10
BenchmarkStackFormatting/%v-stack-10-10        	19284439	        61.70 ns/op	       8 B/op	       1 allocs/op
BenchmarkStackFormatting/%+v-stack-10
BenchmarkStackFormatting/%+v-stack-10-10       	 4179945	       287.1 ns/op	     160 B/op	       4 allocs/op
BenchmarkStackFormatting/%s-stack-30
BenchmarkStackFormatting/%s-stack-30-10        	19776687	        60.28 ns/op	       8 B/op	       1 allocs/op
BenchmarkStackFormatting/%v-stack-30
BenchmarkStackFormatting/%v-stack-30-10        	19264303	        61.69 ns/op	       8 B/op	       1 allocs/op
BenchmarkStackFormatting/%+v-stack-30
BenchmarkStackFormatting/%+v-stack-30-10       	 4077853	       289.3 ns/op	     160 B/op	       4 allocs/op
BenchmarkStackFormatting/%s-stack-60
BenchmarkStackFormatting/%s-stack-60-10        	19691418	        60.39 ns/op	       8 B/op	       1 allocs/op
BenchmarkStackFormatting/%v-stack-60
BenchmarkStackFormatting/%v-stack-60-10        	19310701	        62.05 ns/op	       8 B/op	       1 allocs/op
BenchmarkStackFormatting/%+v-stack-60
BenchmarkStackFormatting/%+v-stack-60-10       	 4149933	       290.0 ns/op	     160 B/op	       4 allocs/op
BenchmarkStackFormatting/%s-stacktrace-10
BenchmarkStackFormatting/%s-stacktrace-10-10   	17911460	        66.99 ns/op	      24 B/op	       1 allocs/op
BenchmarkStackFormatting/%v-stacktrace-10
BenchmarkStackFormatting/%v-stacktrace-10-10   	17212515	        68.87 ns/op	      24 B/op	       1 allocs/op
BenchmarkStackFormatting/%+v-stacktrace-10
BenchmarkStackFormatting/%+v-stacktrace-10-10  	 3886822	       309.6 ns/op	     184 B/op	       5 allocs/op
BenchmarkStackFormatting/%s-stacktrace-30
BenchmarkStackFormatting/%s-stacktrace-30-10   	17860774	        66.80 ns/op	      24 B/op	       1 allocs/op
BenchmarkStackFormatting/%v-stacktrace-30
BenchmarkStackFormatting/%v-stacktrace-30-10   	17184109	        68.65 ns/op	      24 B/op	       1 allocs/op
BenchmarkStackFormatting/%+v-stacktrace-30
BenchmarkStackFormatting/%+v-stacktrace-30-10  	 3900709	       309.5 ns/op	     184 B/op	       5 allocs/op
BenchmarkStackFormatting/%s-stacktrace-60
BenchmarkStackFormatting/%s-stacktrace-60-10   	17731980	        66.57 ns/op	      24 B/op	       1 allocs/op
BenchmarkStackFormatting/%v-stacktrace-60
BenchmarkStackFormatting/%v-stacktrace-60-10   	17391933	        69.05 ns/op	      24 B/op	       1 allocs/op
BenchmarkStackFormatting/%+v-stacktrace-60
BenchmarkStackFormatting/%+v-stacktrace-60-10  	 3918705	       317.7 ns/op	     184 B/op	       5 allocs/op

License

This package is licensed under the MIT License.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages