v149 · Web APIs · Payments
Error Log Replay
Select a payment scenario to run the full promise chain — from PaymentRequest.show() to the catch block — and see exactly which DOMException.name lands. Chrome 149 makes AbortError (user cancelled) distinct from OperationError (internal app failure) so merchant code can react correctly to each.
Payment handler setup
Install the handler, then select a scenario. Each scenario invokes a real PaymentRequest from that button click.
0runs
0AbortError
0OperationError
0other names
Promise trace
Select a scenario above to invoke PaymentRequest.show().
Merchant catch block — what you should write
try {
const response = await request.show();
await response.complete('success');
} catch (err) {
if (err.name === 'AbortError') {
// User pressed Cancel — respect the decision, show "Continue shopping"
showContinueShopping();
} else if (err.name === 'OperationError') {
// Internal payment app failure — retry or offer an alternative method
offerAlternativePayment();
} else {
// NotSupportedError, SecurityError, etc. — not payment-handler specific
showGenericError(err.message);
}
}
see also
- Error Signal Tester — throw either error type on demand
- Smart Retry Flow — polite cancellation vs. automatic retry
- Live Checkout Flow — full end-to-end checkout
- Merchant Decision Tree — visual routing by error name
- ChromeStatus entry