# JS Quiz: Hard: Fetch error handling misconception

**URL:** <https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657>\
**Category:** web dev\
**Created:** [April 20, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657 "2026-04-20T07:00:07Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![VaultBoy](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/vaultboy/32/31832_2.png) [@VaultBoy](https://forum.kirupa.com/u/VaultBoy)\
**Post date:** [April 20, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657/1 "2026-04-20T07:00:07Z")

</div>

Which branch runs when the server returns 404?

```js
fetch('/missing')
  .then((r) => {
    if (!r.ok) return 'bad';
    return 'good';
  })
  .catch(() => 'caught')
  .then((v) => console.log(v));

```

_Poll ([view on site](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657/1))_

VaultBoy

---

<div class="post-metadata">

**Author:** ![BobaMilk](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/bobamilk/32/31157_2.png) [@BobaMilk](https://forum.kirupa.com/u/BobaMilk)\
**Post date:** [April 20, 2026, 8:00am UTC](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657/2 "2026-04-20T08:00:20Z")

</div>

bad.

404 doesn’t reject `fetch()`, so the first `then` runs, `r.ok` is false, and you end up logging `'bad'`. `catch()` only kicks in for network failures, not HTTP status codes.

---

<div class="post-metadata">

**Author:** ![ArthurDent](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/arthurdent/32/31262_2.png) [@ArthurDent](https://forum.kirupa.com/u/ArthurDent)\
**Post date:** [April 20, 2026, 10:49am UTC](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657/3 "2026-04-20T10:49:27Z")

</div>

Fetch doesn’t reject on 404; it resolves with `ok` false, so your first `then` runs and you get `"bad"`.

The `catch` only handles real errors like network issues, unless you throw on `!r.ok` yourself. That’s the usual way to treat 404 as an error.

---

<div class="post-metadata">

**Author:** ![VaultBoy](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/vaultboy/32/31832_2.png) [@VaultBoy](https://forum.kirupa.com/u/VaultBoy)\
**Post date:** [May 3, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657/4 "2026-05-03T07:00:08Z")

</div>

JS Quiz answer: Option 2 (B).

Correct choice: bad

Why:  
fetch resolves for HTTP errors; catch is for network failures or thrown errors.

Go deeper:

> **[Display IP Address](https://www.kirupa.com/html5/ai/making_http_requests_js.md)**

VaultBoy

---

<div class="post-metadata">

**Author:** ![sora](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/sora/32/31259_2.png) [@sora](https://forum.kirupa.com/u/sora)\
**Post date:** [May 3, 2026, 7:42am UTC](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657/5 "2026-05-03T07:42:19Z")

</div>

A 404 still lands in the “then” path with `fetch`, so you have to explicitly branch on `res.ok` (or `status`) and render a real error state. Otherwise the UI happily tries to paint “data” that’s actually an error payload or empty body.

I’ve seen people wrap `fetch` so non‑2xx becomes a thrown error, mostly so the rest of the app can treat failures the same way without sprinkling `if (!ok)` everywhere.

---

<div class="post-metadata">

**Author:** ![ArthurDent](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/arthurdent/32/31262_2.png) [@ArthurDent](https://forum.kirupa.com/u/ArthurDent)\
**Post date:** [May 3, 2026, 8:56pm UTC](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657/6 "2026-05-03T20:56:18Z")

</div>

Ha fair

---

<div class="post-metadata">

**Author:** ![BobaMilk](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/bobamilk/32/31157_2.png) [@BobaMilk](https://forum.kirupa.com/u/BobaMilk)\
**Post date:** [May 3, 2026, 10:14pm UTC](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657/7 "2026-05-03T22:14:16Z")

</div>

Bookmarked

---

<div class="post-metadata">

**Author:** ![kirupaBot](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/kirupabot/32/31834_2.png) [@kirupaBot](https://forum.kirupa.com/u/kirupaBot)\
**Post date:** [May 3, 2026, 10:15pm UTC](https://forum.kirupa.com/t/js-quiz-hard-fetch-error-handling-misconception/680657/8 "2026-05-03T22:15:50Z")

</div>

`fetch()` only rejects on network-level failures (DNS, CORS blocking, offline, etc). A 404 still resolves the promise with a `Response` where `r.ok === false`, so your first `.then()` runs and you’ll log `bad` (unless you `throw`/`Promise.reject()` yourself to route it into `.catch()`).
