Skip to main content

Glossary

Unhandled promise rejection

The failed request nobody was listening for.

By · Last updated: September 2026

TL;DR

An unhandled promise rejection happens when a JavaScript promise fails and no code has attached a handler for the failure — no .catch() and no try/catch around an await. The browser reports it as "Uncaught (in promise)" in the console and fires an unhandledrejection event; the feature that depended on it quietly stops working.

Free plan, no credit card. 1,000 credits a month.

How it works

How it happens

A promise either fulfils or rejects. If it rejects and, by the time the current task finishes, nothing has attached a rejection handler, the runtime calls it unhandled. The classic case is a fetch whose error nobody catches:

Two unhandled rejections
// 1. An async function called without await or .catch()
async function loadPrices() {
  const res = await fetch("/api/prices");
  if (!res.ok) throw new Error(`prices: ${res.status}`);
  render(await res.json());
}
loadPrices(); // a 500 here rejects, and nothing is listening

// 2. A .then() chain with no .catch()
fetch("/api/user").then((res) => res.json()).then(showUser);

The page does not crash. The prices simply never render, and the only trace is a line in the console — which no one reads on a production site.

In practice

Catching them

Handle the rejection where it happens (try/catch around await, or .catch()), and add a global listener as a safety net that reports the ones you missed:

A last line of defence
window.addEventListener("unhandledrejection", (event) => {
  reportError(event.reason); // send it to your error tracker
});

In Node.js the default is stricter: since version 15 an unhandled rejection terminates the process.

URLpipe

Finding them with URLpipe

/console loads the page in real Chrome and returns what it logs: console.error, console.warn, uncaught exceptions and unhandled promise rejections, the last two with type exception. It keeps listening briefly after the network settles, so a rejection from a late API call is caught. Run it on pages you don't control, or after each deploy on the ones you do.

What it does not capture: console.log output, failed resource loads that raise no error, and messages from inside third-party iframes, which have their own console.

POST /console — a rejection in the result
[
  { "type": "exception", "text": "Uncaught (in promise) Error: prices: 500" },
  { "type": "warning", "text": "[analytics] no consent yet, 3 events queued" }
]

FAQ

Frequently asked questions

That a promise rejected and no handler caught it. The value after the message is the rejection reason — often an Error from a failed fetch.

See it on your own pages.

Free plan, no card. Confirm your email and your API key is live — you'll be making real requests in minutes.