HTTP errors (4xx, 5xx status codes) don't automatically throw exceptions in fetch().
The Promise resolves successfully — you must check response.ok or
response.status to detect errors.
This is one of the most common mistakes when using fetch(). Always check for errors before parsing the response body.