errors
Simple Go error handling primitives that add stack traces and context without losing the original cause.
Repository Health
Technical Analysis
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
1Panel
Devops · Hosting Control Panel · Monitoring
The only open-source VPS control panel with native AI agent runtime — deploy websites, Docker stacks, and local LLMs from one web interface.
Beta9
Developer Tools · AI Development · Data Engineering
Run AI workloads at scale with a Pythonic serverless runtime that handles GPU inference, background jobs, and sandboxes with zero infrastructure overhead.
Bytebase
Devops
An open-source database CI/CD and DevSecOps platform — schema migration review, GitOps-driven changes, data masking, and access control across MySQL, PostgreSQL, Oracle, Snowflake, MongoDB, and more.
CasaOS
Hosting Control Panel · File Storage
Your simple, elegant personal cloud OS for home data and apps
CubeSandbox
Developer Tools · Security · AI Agents
Instant, concurrent, hardware-isolated MicroVM sandboxes for AI agents — E2B-API compatible, sub-60ms cold starts, and a built-in zero-trust egress proxy, all self-hostable at scale.
Digger
Devops · Automation · Developer Tools
Run Terraform and OpenTofu natively inside your existing CI pipeline — no separate runners, no third-party secrets, no extra compute costs.
Docker (Moby)
Devops · Developer Tools
The open-source container engine at the heart of Docker — a modular toolkit of runtime, build, and networking components for assembling container-based systems.
Dolt
Databases · Data Engineering · Developer Tools
The SQL database you can branch, merge, diff, and clone — Git for your data, MySQL-compatible and ready for multi-agent AI workflows.
Focalboard
Productivity · Project Management · Collaboration
Self-hosted, open source project management with Kanban, table, gallery, and calendar views — a privacy-first alternative to Trello, Notion, and Asana.