400/500 is not an error, it’s a response. You’d only get an exception (rejection) when there’s a network problem.
When the server answers, you have to check whether it’s good or not:
try {
let response = await fetch('not-a-real-url')
if (!response.ok) // or check for response.status
throw new Error(response.statusText);
let body = await response.text(); // or .json() or whatever
// process body
} catch (err) {
console.log(err)
}