Skip to content
28 changes: 26 additions & 2 deletions src/Sentry/HubExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Sentry.Infrastructure;
using Sentry.Internal;
using Sentry.Internal.Extensions;
using Sentry.Protocol;

namespace Sentry;

Expand Down Expand Up @@ -268,8 +269,16 @@ public LockedScope(IHub hub)
public void Dispose() => _scope.Dispose();
}

internal static SentryId CaptureExceptionInternal(this IHub hub, Exception ex) =>
hub.CaptureEvent(new SentryEvent(ex));
internal static SentryId CaptureExceptionInternal(this IHub hub, Exception ex)
{
// Integrations stamp the flag via SetSentryMechanism before calling this (e.g. WinUI forwards the
// platform's Handled value); only default to unhandled when nothing was declared.
Comment on lines +274 to +275

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggest we make this a bit clearer. This method is internal and the mechanism is always set by internal integrations before it's called.

We can add it - I think we should note in the comment that it's defensive only, if we do.

Suggested change
// Integrations stamp the flag via SetSentryMechanism before calling this (e.g. WinUI forwards the
// platform's Handled value); only default to unhandled when nothing was declared.
// Integrations always call `SetSentryMechanism` before calling this method, so
// this fallback is defensive only. In practice, this code never executes.

if (!ex.Data.Contains(Mechanism.HandledKey))
{
ex.Data[Mechanism.HandledKey] = false;
}
return hub.CaptureEvent(new SentryEvent(ex));
}
Comment thread
vladbrincoveanu marked this conversation as resolved.

/// <summary>
/// Captures the exception with a configurable scope callback.
Expand All @@ -281,6 +290,21 @@ internal static SentryId CaptureExceptionInternal(this IHub hub, Exception ex) =
public static SentryId CaptureException(this IHub hub, Exception ex, Action<Scope> configureScope) =>
hub.CaptureEvent(new SentryEvent(ex), configureScope);

/// <summary>
/// Captures the exception with a configurable scope callback, explicitly marking it as handled or unhandled.
/// </summary>
/// <param name="hub">The Sentry hub.</param>
/// <param name="ex">The exception.</param>
/// <param name="configureScope">The callback to configure the scope.</param>
/// <param name="handled">Whether the exception was handled. Recorded on the exception, overriding any flag
/// previously set on it, including one set via <see cref="SentryExceptionExtensions.SetSentryMechanism"/>.</param>
/// <returns>The Id of the event</returns>
public static SentryId CaptureException(this IHub hub, Exception ex, Action<Scope> configureScope, bool handled)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd suggest reordering the parameters. The action will likely be a lambda function which could be arbitrarily long/complex. Having the bool as the last parameter would make things harder to read.

Suggested change
public static SentryId CaptureException(this IHub hub, Exception ex, Action<Scope> configureScope, bool handled)
public static SentryId CaptureException(this IHub hub, Exception ex, bool handled, Action<Scope> configureScope)

{
ex.Data[Mechanism.HandledKey] = handled;
return hub.CaptureEvent(new SentryEvent(ex), configureScope);
}
Comment thread
sentry[bot] marked this conversation as resolved.

/// <summary>
/// Captures feedback from the user.
/// </summary>
Expand Down
13 changes: 4 additions & 9 deletions src/Sentry/Internal/MainExceptionProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -174,17 +174,12 @@ private static Mechanism GetMechanism(Exception exception, int id, int? parentId
mechanism.Handled = handled;
exception.Data.Remove(Mechanism.HandledKey);
}
else if (exception.StackTrace != null)
{
// The exception was thrown, but it was caught by the user, not an integration.
// Thus, we can mark it as handled.
mechanism.Handled = true;
}
else
{
// The exception was never thrown. It was just constructed and then captured.
// Thus, it is neither handled nor unhandled.
mechanism.Handled = null;
// https://getsentry.github.io/relay/relay_event_schema/protocol/struct.Mechanism.html#structfield.handled
// "Exceptions captured using capture_exception (called from user code) are handled=true as the user
// explicitly captured the exception (and therefore kind of handled it)."
mechanism.Handled = true;

@jamescrosswell jamescrosswell Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would be a change in behaviour. I think it probably makes sense... we can probably do it without making a major release - arguably it's a bug fix rather than an arbitrary change.

@dingsdax do you have any steer?

}

if (exception.Data[Mechanism.MechanismKey] is string mechanismType)
Comment thread
vladbrincoveanu marked this conversation as resolved.
Expand Down
20 changes: 20 additions & 0 deletions src/Sentry/SentryClientExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Sentry.Extensibility;
using Sentry.Internal;
using Sentry.Protocol;

namespace Sentry;

Expand All @@ -18,6 +19,25 @@ public static class SentryClientExtensions
public static SentryId CaptureException(this ISentryClient client, Exception ex) =>
client.IsEnabled ? client.CaptureEvent(new SentryEvent(ex)) : SentryId.Empty;

/// <summary>
/// Captures the exception, explicitly marking it as handled or unhandled.
/// </summary>
/// <param name="client">The Sentry client.</param>
/// <param name="ex">The exception.</param>
/// <param name="handled">Whether the exception was handled. Recorded on the exception, overriding any flag
/// previously set on it, including one set via <see cref="SentryExceptionExtensions.SetSentryMechanism"/>.</param>
/// <returns>The Id of the event</returns>
public static SentryId CaptureException(this ISentryClient client, Exception ex, bool handled)
{
if (!client.IsEnabled)
{
return SentryId.Empty;
}

ex.Data[Mechanism.HandledKey] = handled;
return client.CaptureEvent(new SentryEvent(ex));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unhandled capture crashes sessions

High Severity

Public CaptureException with handled: false stamps only Mechanism.HandledKey and leaves Terminal unset. Session logic treats unhandled-with-unset-terminal as UnhandledTerminal, so a manual capture ends the session as Crashed and aborts the active transaction even though the process kept running.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 5e8b0b1. Configure here.

@vladbrincoveanu vladbrincoveanu Jul 26, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed, this is the current behavior: handled: false stamps only Mechanism.HandledKey and leaves Terminal unset. A genuinely unhandled exception (e.g. AppDomain.UnhandledException) sets handled: false with no terminal flag, which counts as a Crash (see SentryEvent.HasUnhandledTerminalException).

Adding terminal control to the CaptureException signature (defaulting Terminal = false for user-parameter captures) would expand the API surface beyond what #3383 asks for, so I kept it out of this PR , but happy to open a follow-up issue for it, if you think the session-crash default is too surprising for manual captures. What do you think? @jamescrosswell

(The related WinUI issue CaptureExceptionInternal overwriting the platform-forwarded Handled flag, has since been fixed in 3663ee5; only the session-terminal question above remains open.)

@jamescrosswell jamescrosswell Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK this is going down a bit of a 🐇 🕳️ - apologies in advance for the long reply...

The TLDR; is that I think we need to expose a way to set both Handled and Terminal (not just Handled).

Detailed response

Terminal exists to determine two things:

  1. A session's end status (Release Health)
    a. Only relevant for mobile/desktop/gaming clients (makes no sense for ASP.NET Core)
  2. Whether to abort the active

SentryEvent.GetExceptionType() collapses Handled+Terminal into three buckets:

Handled Terminal ExceptionType Consequence
not false (ignored) Handled ReportError() — session stays alive, error count++
false unset / not false UnhandledTerminal EndSession(Crashed) and aborts the active transaction
false explicitly false UnhandledNonTerminal MarkSessionAsUnhandled() — session flagged, but not ended, transaction not aborted

Session Health

So Terminal only matters when Handled: false and it's basically used to distinguish between unhandled and crashed from the perspective of Release Health. In the .net SDK, that's captured via the the SessionEndStatus in the SentryClient:

var exceptionType = processedEvent.GetExceptionType();
switch (exceptionType)
{
case SentryEvent.ExceptionType.UnhandledNonTerminal:
_options.LogDebug("Marking session as 'Unhandled', due to non-terminal unhandled exception.");
_sessionManager.MarkSessionAsUnhandled();
break;
case SentryEvent.ExceptionType.UnhandledTerminal:
_options.LogDebug("Ending session as 'Crashed', due to unhandled exception.");
scope.SessionUpdate = _sessionManager.EndSession(SessionEndStatus.Crashed);
break;
case SentryEvent.ExceptionType.Handled:
_options.LogDebug("Updating session by reporting an error.");
scope.SessionUpdate = _sessionManager.ReportError();
break;
}

And importantly, unhandled exceptions are terminal by default in the .NET SDK:

internal bool HasUnhandledTerminalException()
{
// Check if the original exception was unhandled and not explicitly marked as non-terminal
if (Exception?.Data[Mechanism.HandledKey] is false)
{
// If it's unhandled but explicitly marked as non-terminal, return false
if (Exception.Data[Mechanism.TerminalKey] is false)
{
return false;
}
// Otherwise, unhandled exceptions are terminal by default
return true;
}
// Check if any Sentry exceptions are unhandled and terminal
// (handled: false and terminal: not explicitly false)
return SentryExceptions?.Any(e =>
e.Mechanism is { Handled: false } &&
e.Mechanism.Terminal != false
) ?? false;
}
private bool HasUnhandledNonTerminalException()
{
// Generally, an unhandled exception is considered terminal.
// Exception: If it is an unhandled exception but the terminal flag is explicitly set to false.
// I.e. captured through the UnobservedTaskExceptionIntegration, or the exception capture integrations in the Unity SDK
if (Exception?.Data[Mechanism.HandledKey] is false)
{
if (Exception.Data[Mechanism.TerminalKey] is false)
{
return true;
}
return false;
}
return SentryExceptions?.Any(e =>
e.Mechanism is { Handled: false, Terminal: false }
) ?? false;
}

Transactions

The impact on transactions is not dependent on the app model and so impacts all apps (including ASP.NET Core).

An UnhandledTerminal exception finishes the current transaction as Aborted (except OTel transactions, which the SpanProcessor handles).

  • AppDomainUnhandledExceptionIntegrationhandled: false, no terminal ⇒ Terminal/Crashed. (Console, generic .NET, and the process is genuinely dying.)
  • WinUIUnhandledExceptionIntegration — passes through the platform's Handled bool; if !handled, terminal/Crashed.
  • UnobservedTaskExceptionIntegration — the one built-in case that sets terminal: false (async-void / unawaited Task.Run — unhandled but doesn't crash).
  • SentryMiddleware and AspNetCoreExceptionProcessor — mark handled: false, no terminal flag ⇒ No session tracking in ASP.NET Core and so all this does is terminate the Transaction with an error state, which is the desired behaviour for a 5xx.

What this means for this PR

CaptureException(ex, handled: false) stamps only HandledKey, leaves Terminal unset, so it always classifies Unhandled as UnhandledTerminal = Crash.

  • ASP.NET Core / web: Manual handled: false capture will abort the active transaction, which might be surprising to SDK users!!!
  • MAUI / desktop clients: Manual handled: false capture will end the session as Crashed and open a new one, denting the crash-free-sessions rate — even though nothing actually crashed. Again, possibly surprising to SDK users manually setting handled to false.

So I don't think we can expose handled without also exposing a way to set terminal - since without that you allow SDK users to specify UnhandledTerminal (crash) but no way to specify UnhandledNonTerminal (unhandled but not a crash).

@vladbrincoveanu vladbrincoveanu Jul 28, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi James,
Thanks for taking the time to explain this.
I will take care of the comments next week Monday. Should I leave the PR in an opened state until then?


/// <summary>
/// Captures a message.
/// </summary>
Expand Down
26 changes: 26 additions & 0 deletions src/Sentry/SentrySdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,17 @@ public static SentryId CaptureEvent(SentryEvent evt, SentryHint? hint, Action<Sc
public static SentryId CaptureException(Exception exception)
=> CurrentHub.CaptureException(exception);

/// <summary>
/// Captures the exception, explicitly marking it as handled or unhandled.
/// </summary>
/// <param name="exception">The exception.</param>
/// <param name="handled">Whether the exception was handled. Recorded on the exception, overriding any flag
/// previously set on it, including one set via <see cref="SentryExceptionExtensions.SetSentryMechanism"/>.</param>
/// <returns>The Id of the event.</returns>
[DebuggerStepThrough]
public static SentryId CaptureException(Exception exception, bool handled)
=> CurrentHub.CaptureException(exception, handled);

/// <summary>
/// Captures the exception with a configurable scope.
/// </summary>
Expand All @@ -537,6 +548,21 @@ public static SentryId CaptureException(Exception exception)
public static SentryId CaptureException(Exception exception, Action<Scope> configureScope)
=> CurrentHub.CaptureException(exception, configureScope);

/// <summary>
/// Captures the exception with a configurable scope, explicitly marking it as handled or unhandled.
/// </summary>
/// <remarks>
/// This allows modifying a scope without affecting other events.
/// </remarks>
/// <param name="exception">The exception.</param>
/// <param name="configureScope">The callback to configure the scope.</param>
/// <param name="handled">Whether the exception was handled. Recorded on the exception, overriding any flag
/// previously set on it, including one set via <see cref="SentryExceptionExtensions.SetSentryMechanism"/>.</param>
/// <returns>The Id of the event.</returns>
[DebuggerStepThrough]
public static SentryId CaptureException(Exception exception, Action<Scope> configureScope, bool handled)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See related comment above.

Suggested change
public static SentryId CaptureException(Exception exception, Action<Scope> configureScope, bool handled)
public static SentryId CaptureException(Exception exception, bool handled, Action<Scope> configureScope)

=> CurrentHub.CaptureException(exception, configureScope, handled);

/// <summary>
/// Captures the message.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
Value: my exception,
Mechanism: {
Type: generic,
Handled: true,
Synthetic: false,
IsExceptionGroup: false,
Data: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
Value: my exception,
Mechanism: {
Type: generic,
Handled: true,
Synthetic: false,
IsExceptionGroup: false,
Data: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
Value: my exception,
Mechanism: {
Type: generic,
Handled: true,
Synthetic: false,
IsExceptionGroup: false,
Data: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
Value: my exception,
Mechanism: {
Type: generic,
Handled: true,
Synthetic: false,
IsExceptionGroup: false,
Data: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
Value: my exception,
Mechanism: {
Type: generic,
Handled: true,
Synthetic: false,
IsExceptionGroup: false,
Data: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
Value: my exception,
Mechanism: {
Type: generic,
Handled: true,
Synthetic: false,
IsExceptionGroup: false,
Data: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ namespace Sentry
public static void AddBreadcrumb(this Sentry.IHub hub, string message, string? category = null, string? type = null, System.Collections.Generic.IDictionary<string, string>? data = null, Sentry.BreadcrumbLevel level = 0) { }
public static void AddBreadcrumb(this Sentry.IHub hub, Sentry.Infrastructure.ISystemClock? clock, string message, string? category = null, string? type = null, System.Collections.Generic.IDictionary<string, string>? data = null, Sentry.BreadcrumbLevel level = 0) { }
public static Sentry.SentryId CaptureException(this Sentry.IHub hub, System.Exception ex, System.Action<Sentry.Scope> configureScope) { }
public static Sentry.SentryId CaptureException(this Sentry.IHub hub, System.Exception ex, System.Action<Sentry.Scope> configureScope, bool handled) { }
public static Sentry.SentryId CaptureFeedback(this Sentry.IHub hub, Sentry.SentryFeedback feedback, System.Action<Sentry.Scope> configureScope, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureMessage(this Sentry.IHub hub, string message, System.Action<Sentry.Scope> configureScope, Sentry.SentryLevel level = 1) { }
public static void LockScope(this Sentry.IHub hub) { }
Expand Down Expand Up @@ -491,6 +492,7 @@ namespace Sentry
public static class SentryClientExtensions
{
public static Sentry.SentryId CaptureException(this Sentry.ISentryClient client, System.Exception ex) { }
public static Sentry.SentryId CaptureException(this Sentry.ISentryClient client, System.Exception ex, bool handled) { }
public static Sentry.SentryId CaptureFeedback(this Sentry.ISentryClient client, Sentry.SentryFeedback feedback, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureFeedback(this Sentry.ISentryClient client, string message, string? contactEmail = null, string? name = null, string? replayId = null, string? url = null, Sentry.SentryId? associatedEventId = default, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureMessage(this Sentry.ISentryClient client, string message, Sentry.SentryLevel level = 1) { }
Expand Down Expand Up @@ -978,6 +980,8 @@ namespace Sentry
public static Sentry.SentryId CaptureEvent(Sentry.SentryEvent evt, Sentry.SentryHint? hint, System.Action<Sentry.Scope> configureScope) { }
public static Sentry.SentryId CaptureException(System.Exception exception) { }
public static Sentry.SentryId CaptureException(System.Exception exception, System.Action<Sentry.Scope> configureScope) { }
public static Sentry.SentryId CaptureException(System.Exception exception, bool handled) { }
public static Sentry.SentryId CaptureException(System.Exception exception, System.Action<Sentry.Scope> configureScope, bool handled) { }
public static Sentry.SentryId CaptureFeedback(Sentry.SentryFeedback feedback, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureFeedback(Sentry.SentryFeedback feedback, System.Action<Sentry.Scope> configureScope, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureFeedback(Sentry.SentryFeedback feedback, out Sentry.CaptureFeedbackResult result, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ namespace Sentry
public static void AddBreadcrumb(this Sentry.IHub hub, string message, string? category = null, string? type = null, System.Collections.Generic.IDictionary<string, string>? data = null, Sentry.BreadcrumbLevel level = 0) { }
public static void AddBreadcrumb(this Sentry.IHub hub, Sentry.Infrastructure.ISystemClock? clock, string message, string? category = null, string? type = null, System.Collections.Generic.IDictionary<string, string>? data = null, Sentry.BreadcrumbLevel level = 0) { }
public static Sentry.SentryId CaptureException(this Sentry.IHub hub, System.Exception ex, System.Action<Sentry.Scope> configureScope) { }
public static Sentry.SentryId CaptureException(this Sentry.IHub hub, System.Exception ex, System.Action<Sentry.Scope> configureScope, bool handled) { }
public static Sentry.SentryId CaptureFeedback(this Sentry.IHub hub, Sentry.SentryFeedback feedback, System.Action<Sentry.Scope> configureScope, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureMessage(this Sentry.IHub hub, string message, System.Action<Sentry.Scope> configureScope, Sentry.SentryLevel level = 1) { }
public static void LockScope(this Sentry.IHub hub) { }
Expand Down Expand Up @@ -491,6 +492,7 @@ namespace Sentry
public static class SentryClientExtensions
{
public static Sentry.SentryId CaptureException(this Sentry.ISentryClient client, System.Exception ex) { }
public static Sentry.SentryId CaptureException(this Sentry.ISentryClient client, System.Exception ex, bool handled) { }
public static Sentry.SentryId CaptureFeedback(this Sentry.ISentryClient client, Sentry.SentryFeedback feedback, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureFeedback(this Sentry.ISentryClient client, string message, string? contactEmail = null, string? name = null, string? replayId = null, string? url = null, Sentry.SentryId? associatedEventId = default, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureMessage(this Sentry.ISentryClient client, string message, Sentry.SentryLevel level = 1) { }
Expand Down Expand Up @@ -978,6 +980,8 @@ namespace Sentry
public static Sentry.SentryId CaptureEvent(Sentry.SentryEvent evt, Sentry.SentryHint? hint, System.Action<Sentry.Scope> configureScope) { }
public static Sentry.SentryId CaptureException(System.Exception exception) { }
public static Sentry.SentryId CaptureException(System.Exception exception, System.Action<Sentry.Scope> configureScope) { }
public static Sentry.SentryId CaptureException(System.Exception exception, bool handled) { }
public static Sentry.SentryId CaptureException(System.Exception exception, System.Action<Sentry.Scope> configureScope, bool handled) { }
public static Sentry.SentryId CaptureFeedback(Sentry.SentryFeedback feedback, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureFeedback(Sentry.SentryFeedback feedback, System.Action<Sentry.Scope> configureScope, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureFeedback(Sentry.SentryFeedback feedback, out Sentry.CaptureFeedbackResult result, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ namespace Sentry
public static void AddBreadcrumb(this Sentry.IHub hub, string message, string? category = null, string? type = null, System.Collections.Generic.IDictionary<string, string>? data = null, Sentry.BreadcrumbLevel level = 0) { }
public static void AddBreadcrumb(this Sentry.IHub hub, Sentry.Infrastructure.ISystemClock? clock, string message, string? category = null, string? type = null, System.Collections.Generic.IDictionary<string, string>? data = null, Sentry.BreadcrumbLevel level = 0) { }
public static Sentry.SentryId CaptureException(this Sentry.IHub hub, System.Exception ex, System.Action<Sentry.Scope> configureScope) { }
public static Sentry.SentryId CaptureException(this Sentry.IHub hub, System.Exception ex, System.Action<Sentry.Scope> configureScope, bool handled) { }
public static Sentry.SentryId CaptureFeedback(this Sentry.IHub hub, Sentry.SentryFeedback feedback, System.Action<Sentry.Scope> configureScope, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureMessage(this Sentry.IHub hub, string message, System.Action<Sentry.Scope> configureScope, Sentry.SentryLevel level = 1) { }
public static void LockScope(this Sentry.IHub hub) { }
Expand Down Expand Up @@ -491,6 +492,7 @@ namespace Sentry
public static class SentryClientExtensions
{
public static Sentry.SentryId CaptureException(this Sentry.ISentryClient client, System.Exception ex) { }
public static Sentry.SentryId CaptureException(this Sentry.ISentryClient client, System.Exception ex, bool handled) { }
public static Sentry.SentryId CaptureFeedback(this Sentry.ISentryClient client, Sentry.SentryFeedback feedback, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureFeedback(this Sentry.ISentryClient client, string message, string? contactEmail = null, string? name = null, string? replayId = null, string? url = null, Sentry.SentryId? associatedEventId = default, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureMessage(this Sentry.ISentryClient client, string message, Sentry.SentryLevel level = 1) { }
Expand Down Expand Up @@ -978,6 +980,8 @@ namespace Sentry
public static Sentry.SentryId CaptureEvent(Sentry.SentryEvent evt, Sentry.SentryHint? hint, System.Action<Sentry.Scope> configureScope) { }
public static Sentry.SentryId CaptureException(System.Exception exception) { }
public static Sentry.SentryId CaptureException(System.Exception exception, System.Action<Sentry.Scope> configureScope) { }
public static Sentry.SentryId CaptureException(System.Exception exception, bool handled) { }
public static Sentry.SentryId CaptureException(System.Exception exception, System.Action<Sentry.Scope> configureScope, bool handled) { }
public static Sentry.SentryId CaptureFeedback(Sentry.SentryFeedback feedback, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureFeedback(Sentry.SentryFeedback feedback, System.Action<Sentry.Scope> configureScope, Sentry.SentryHint? hint = null) { }
public static Sentry.SentryId CaptureFeedback(Sentry.SentryFeedback feedback, out Sentry.CaptureFeedbackResult result, Sentry.Scope? scope = null, Sentry.SentryHint? hint = null) { }
Expand Down
Loading
Loading