Capturing errors
How ErrorDock groups exceptions into issues by their in-app stack frames, what context travels with each event, and how regressions are detected.
ErrorDock captures unhandled exceptions automatically and handled exceptions on request.
Grouping
An event's fingerprint is a SHA-256 of the in-app frames of its stack trace — your own code. Framework and package frames are excluded, so the same logical bug does not split into several issues after a dependency upgrade. Line numbers are excluded too, so a redeploy that moves code around does not split an issue either.
When an event has no in-app frames, the fingerprint falls back to all of its frames, and when it has no stack trace at all, to the message.
Grouping too aggressively hides distinct bugs. Grouping too loosely produces a list nobody reads. The rule above is the whole of it: there is no manual merge or split and no custom fingerprint, so how events group is something you can predict rather than adjust.
Context
| Field | Why it matters |
|---|---|
| Resolved stack trace | Where it failed |
| Breadcrumbs | What the user did first |
| Release | Which deployment introduced it |
| User identifier | Turns event count into affected users |
| Environment | Keeps staging noise out of production triage |
Regressions
When an issue you resolved reappears in a later release, ErrorDock reopens it and marks it a regression rather than creating a new issue. Without that, a fix that did not hold looks like a brand new bug and gets triaged from scratch.
Reporting a handled exception
Inject IErrorDockClient and pass the exception with a message:
try { await _payments.CaptureAsync(order); } catch (PaymentDeclinedException ex) { _errorDock.CaptureException(ex, "Payment declined"); // IErrorDockClient return Result.Declined(); }
Outside dependency injection, the static form is ErrorDockSdk.Client.CaptureException(ex, …).
Last updated October 20, 2026