JS SDK Reference
Exceptions

Exceptions

Capture JavaScript errors and exceptions with full stack traces.

captureException

Capture an error with its stack trace:

import { captureException } from "@tracewayapp/frontend";
 
try {
  riskyOperation();
} catch (error) {
  captureException(error);
}

The SDK extracts the error type, message, and stack trace automatically.

captureExceptionWithAttributes

Capture an error with additional metadata:

import { captureExceptionWithAttributes } from "@tracewayapp/frontend";
 
try {
  processOrder(orderId);
} catch (error) {
  captureExceptionWithAttributes(error, {
    orderId: orderId,
    userId: currentUser.id,
    action: "checkout",
  });
}

Attributes appear as tags in the Traceway dashboard, making it easier to filter and debug issues.

Attribute Best Practices

Do include:

  • User identifiers (anonymized if needed)
  • Request/transaction IDs
  • Feature flags or A/B test variants
  • Relevant business context (order ID, product ID, etc.)

Avoid including:

  • Sensitive data (passwords, tokens, PII)
  • Large objects or arrays
  • Circular references

Error Types

The SDK handles various JavaScript error types:

// Standard Error
captureException(new Error("Something went wrong"));
 
// TypeError
captureException(new TypeError("Cannot read property 'x' of undefined"));
 
// Custom errors
class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = "ValidationError";
  }
}
captureException(new ValidationError("Invalid email format"));

The type shown in Traceway comes from the error's class name, not from this.name. Minifiers rename classes, so in a production build the issue above reads r: Invalid email format rather than ValidationError: Invalid email format. Put anything you need to search or group on into the message or into attributes.

Non-Error Values

Pass real Error objects. The SDK reads only the value's class name and its message property, so anything else loses information and arrives with no stack trace:

// Message is lost. Stored as "String: undefined".
captureException("Something went wrong");
 
// Stored as "Object: Server error". The `code` field is dropped.
captureException({ code: 500, message: "Server error" });

Wrap the value in an Error instead, and pass the extra fields as attributes:

import { captureExceptionWithAttributes } from "@tracewayapp/frontend";
 
captureExceptionWithAttributes(new Error("Server error"), { code: "500" });

React Error Boundaries

For React applications, use the @tracewayapp/react package. Its <TracewayProvider> itself acts as an error boundary: render-time exceptions are captured automatically and re-thrown so the app behaves exactly as without Traceway. See the React documentation for setup, or the Error Boundary page if you need a custom fallback UI for a specific subtree.