Oi, Alex! Tudo bem?
Desculpa a demora por um retorno.
Os erros referentes ao status da solicitação, específico da API utilizada (viaCEP), são definidos na documentação do site, na parte dedicada a informar como ocorre a validação do CEP.
Para um CEP ser inválido nessa API, segundo essa documentação, e consequentemente a promessa ser rejeitada, é necessário que ele possua um formato inválido (número de dígitos diferente de 8), que seja alfanumérico ou que possua um espaço entre os números. Dessa forma, quando o formato do CEP não seguir essas restrições especificadas, será considerado válido, ou seja, retornará uma promessa aprovada. Entretanto, esse retorno conterá um valor de "erro" igual a "true".
Em resumo, todo CEP que possuir 8 digitos, não for alfanumérico e não possuir espaço entre os dígitos, retornará uma promise aceita, por isso, em casos de CEPs que não existem (não estão no banco de dados), mas seguem as especificações, precisaremos usar os métodos de manipulação de uma promise aprovada (.then) e não o .catch.
Somado a isso, como fomos informados pela documentação que em casos de CEPs inexistentes será retornado um valor de "erro" igual a "true". Quando utilizamos throw, estamos dizendo ao interpretador do JavaScript que algo deu errado no código e que queremos parar a execução normal do código e lançar uma exceção.
Dessa maneira, a forma de manipulação necessária nesse caso seria:
var consultaCEP = fetch('https://viacep.com.br/ws/01001000/json/')
.then(resposta => resposta.json())
.then(r => {
if (r.erro) {
throw Error('Esse cep não existe!')
//para quando o CEP for válido mas não existir
} else
console.log(r)
//para quando o CEP for válido e existir
})
.catch(erro => console.log(erro))
//para quando o CEP for inválido
Espero ter ajudado na compreensão! Caso tenha ficado alguma dúvida, sinta-se à vontade para comunicar, estou à disposição!
Um forte abraço e bons estudos!
Caso este post tenha te ajudado, por favor, marcar como solucionado ✓