View Source Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
[0.10.0] - 2026-06-02
Added
- Error wrapping (chaining): error types can now carry a
:cause— the original error, exception, or value that led to them — without losing the context of the underlying failure.- A generated
wrap/1,2macro on each error module wraps a caught error as the:causeof a new error, capturing the current__ENV__(likecreate/1) and, when givenstacktrace: __STACKTRACE__, the original error's stacktrace. new/1,create/1, andraise/2now also accept a:causeparam.- The cause is stored as an
Errata.Causestruct (kind/value/stacktrace). Errata.cause/1returns the immediate cause;Errata.root_cause/1walks the chain to the deepest cause;Errata.format_chain/1renders the fullCaused by:chain for logging.to_map/1(and JSON) now include the cause, recursing into wrapped Errata errors and rendering standard exceptions by type and message.
- A generated
[0.9.0] - 2026-06-02
Added
Errata.create/2macro to create an error of any type while capturing the current env, without a separaterequirefor each error module. (#4)Errata.to_map/1to convert any Errata error to a plain, JSON-encodable map without needing to know the error's specific module. (#5)Errata.display_message/1to retrieve the bare, human-readable:messageof an error (without the:reasonsuffix thatException.message/1appends), for rendering errors to end users. (#7)
Changed
- Breaking:
new/1,create/1, andraise/2now raise anArgumentErrorwhen given unrecognized param keys instead of silently ignoring them. Only:message,:reason, and:contextare accepted. Callers that previously relied on extra keys being dropped will need to remove them. (#3)
Fixed
- Serialized error maps (
to_map/1) and their JSON form no longer leak theElixir.prefix on module names:error_typeandenv.moduleare now rendered as e.g."MyApp.Foo"(as strings rather than raw atoms), andenv.file_lineno longer includes a trailing colon. (#6)