Skip to content
ErrorDock

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