errors

Simple Go error handling primitives that add stack traces and context without losing the original cause.

Library
Go
vv0.9.1
8,257 stars
BSD-2-Clause

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
48 /100 Fair
Development Activity 4
Maintenance 20
Community 68
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
61 /100 Good
Architecture 70
Code Quality 80
Innovation 30
Learning Curve 65

pkg/errors gives Go programs a small set of primitives for annotating errors as they travel up the call stack. Instead of the bare if err != nil { return err } idiom, which throws away debugging context on every return, functions like Wrap and WithStack record a stack trace and an optional message at the point they’re called, while leaving the original error value intact underneath.

Callers that need to inspect the underlying failure can call Cause to unwrap back to the root error, or use the unexported causer and stackTracer interfaces the package documents as part of its stable public API. All returned errors implement fmt.Formatter, so %+v prints the full annotated stack trace alongside the message. A go113.go file bridges the package to the standard library’s Is/As/Unwrap, so it composes with Go 1.13+ error chains without breaking existing call sites.

What You Get

  • Wrap and Wrapf to attach a message and stack trace to an existing error in one call
  • WithStack and WithMessage for attaching just a stack trace or just a message when you need finer control
  • Cause to walk back through a chain of wrapped errors to the original underlying error
  • fmt.Formatter support so %+v prints the message plus a full multi-frame stack trace
  • Compatibility shims (Is, As, Unwrap) for Go 1.13+ standard error chains

Common Use Cases

  • Wrapping errors returned from I/O, database, or network calls with a human-readable message and a stack trace for later debugging
  • Logging or reporting tools that print %+v on an error to get file/line stack traces without a separate tracing library
  • Type-switching on the root cause of a wrapped error via errors.Cause to handle specific error types deep in a call chain
  • Bridging legacy code that used pkg/errors with newer code relying on Go 1.13’s errors.Is/As/Unwrap chain semantics

Under The Hood

Architecture

The package is a single flat unit with no internal layering: errors.go defines the wrapper constructors (New, Errorf, WithStack, Wrap, Wrapf, WithMessage, WithMessagef) and the Cause accessor, stack.go implements the Frame/StackTrace/stack types plus the callers() helper that captures runtime.Callers at each wrap site, and go113.go (behind a go1.13 build tag) re-exports the standard library’s Is/As/Unwrap for chain compatibility. There is no dependency injection or multi-layer data flow — the only composition is struct embedding, where withStack embeds *stack and withMessage wraps a cause plus a message, with behavior surfaced entirely through the Error(), Format(), and unexported causer interfaces. Because every wrapper type embeds *stack directly, any change to callers() or the stack format would propagate to all of them at once — an intentional, tightly coupled design appropriate to a package this small and stable.

Tech Stack

There is no go.mod in the repository (the package predates widespread Go modules adoption and is consumed at its tagged v0.9.1 release), and it has zero external dependencies — only the Go standard library (fmt, io, path, runtime, strconv, strings, and the stdlib errors package in go113.go). Build tooling is a minimal Makefile wrapping go test/go vet, with CI configured through legacy providers (Travis CI and AppVeyor) rather than GitHub Actions. There is nothing to deploy; consumers simply go get and import the package.

Code Quality

Test coverage is extensive relative to the package’s size: errors_test.go, stack_test.go, format_test.go, bench_test.go, example_test.go, go113_test.go, and json_test.go exercise essentially every exported function, including every fmt verb combination (%s/%v/%+v/%q) and JSON marshaling edge cases, using table-driven tests and Go’s Example* convention for documentation-verified output. Error handling is the subject matter itself — errors are modeled as explicit typed structs (fundamental, withStack, withMessage) rather than being swallowed anywhere. Naming is idiomatic Go, the type surface is minimal, and CI runs across multiple Go versions, though via legacy CI providers with no modern linter configuration visible.

What Makes It Unique

The package isn’t attempting anything technically novel today — Go’s standard library has since absorbed similar behavior via fmt.Errorf’s %w verb and errors.Is/As/Unwrap in Go 1.13, which the package’s own go113.go file explicitly bridges to. Its real significance was historical: from roughly 2015 to 2019 it was the de facto standard for stack-trace-carrying error wrapping in Go, popularizing the causer/Cause() pattern that influenced the language’s eventual native %w support. The README itself states the package has moved into maintenance mode, so today it functions as a stable, frozen legacy dependency many large codebases still depend on rather than an active point of innovation.

Used by 33 apps in this directory

TypeScript
50%
Other

SigNoz

Analytics · Monitoring

32,429

Self-host your entire observability stack — logs, metrics, traces, and LLM monitoring — in one OpenTelemetry-native platform, without the Datadog bill.

View details
92
Repo Health
83
Technical
64
Dependency
Built with
TypeScript 50%
Go 38%
Updated 1 weeks ago
Go
66%
GPL 3.0

Stormkit

Devops · Hosting Control Panel

264

Self-hostable platform for deploying and hosting modern web apps with automated CI/CD, custom domains, and a built-in serverless runtime — a true open-source alternative to Vercel and Netlify.

View details
80
Repo Health
79
Technical
67
Dependency
Built with
Go 66%
TypeScript 31%
Updated 1 weeks ago
Go
90%
BSD 3

tau

Devops

5,180

Open-source, Git-native platform-as-a-service for building, deploying, and scaling fullstack apps on your own infrastructure with no DevOps required.

View details
71
Repo Health
82
Technical
65
Dependency
Built with
Go 90%
Updated 2 months ago
Go
95%
Apache 2.0

TiDB

AI Development · Databases

40,672

AI-Native Distributed SQL Database for Agentic Workloads

View details
97
Repo Health
66
Technical
68
Dependency
Built with
Go 95%
Updated 1 weeks ago
Go
90%
Apache 2.0

Warrant

Authentication · Security

1,340

A Google Zanzibar-inspired authorization service for defining, checking, and auditing fine-grained access control across your applications.

View details
45
Repo Health
73
Technical
72
Dependency
Built with
Go 90%
Updated 10 months ago
Go
97%
BSD 3

Weaviate

Databases · Search

16,908

Open-source vector database combining semantic search, hybrid queries, RAG, and image search in a single cloud-native system built for production scale.

View details
91
Repo Health
85
Technical
68
Dependency
Built with
Go 97%
Updated 1 weeks ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers