Error monitoring
Crash and exception reporting with fingerprint grouping, release tracking and symbolicated stack traces.
Every SDK reports uncaught errors automatically; you add handled ones where you catch them. Occurrences are grouped into issues by fingerprint, each with counts, affected people, the release it happened in and the session around it.
Automatic capture
| SDK | What is captured automatically |
|---|---|
| Flutter | FlutterError.onError, PlatformDispatcher.onError, uncaught async errors, and native crashes (forwarded on next launch). Wrap your app in runZonedGuarded for the broadest coverage. |
| JavaScript | Browser error / unhandledrejection; Node uncaughtException / unhandledRejection. |
| PHP | Laravel: unhandled exceptions (NEXUS_CAPTURE_ERRORS=true). Symfony: an exception subscriber. |
| Python | nexus.init() installs excepthooks (main and worker threads); every framework integration reports request/task failures. |
| .NET | UseNexus() middleware reports unhandled request exceptions; the ILogger bridge turns LogError(ex, …) into issues. |
Turn it off with autoCaptureErrors: false / capture_errors=False / the
NEXUS_ERRORS_ENABLED switch.
Reporting handled errors
try {
await risky();
} catch (e, st) {
await context.nexus.errors.capture(e, st, {
'handled': true, // false marks it as a crash
'level': 'error', // trace | debug | info | warn | error | fatal
'feature': 'checkout', // everything else becomes context
});
}Grouping with fingerprints
Without a fingerprint, an issue is type + message. When a message varies per
occurrence — an order id, a user name — that splits one real problem into
hundreds of issues. Pin it:
await nexus.Errors.CaptureAsync($"Gateway timeout for order {id}", fingerprint: "gateway-timeout");
await nexus.Errors.CaptureExceptionAsync(ex, fingerprint: ErrorsResource.Fingerprint(ex)); // from the throw siteIssue workflow
In Errors, each issue is open, resolved or ignored:
- Resolve when a fix ships; reopen it if it comes back.
- Ignore noise you accept — new occurrences are dropped and not billed.
Every issue shows its stack (throw-site first), the release, the people affected, the context you attached, and a link to the session — and, for server errors recorded by Telescope, View the request journey.
Readable stacks
Native crashes in release builds carry raw addresses or obfuscated names. Upload the matching debug file under Errors → Symbols and frames are symbolicated — matched to the crash by UUID / build-id. Uploading a file later and choosing Re-symbolicate on an issue back-fills its stack.
| Kind | Upload | Identifier |
|---|---|---|
| iOS | the .dSYM | dSYM UUID (dwarfdump --uuid) |
| Android native | the unstripped .so | ELF build-id (readelf -n) |
| Android (R8 / ProGuard) | mapping.txt | the mapping UUID |
For .NET, ship the .pdb next to the assembly to get file and line numbers.
