Passo 4: O CEP que não existe
A ViaCEP tem uma pegadinha honesta: um CEP inexistente não vira um erro de rede, vira uma resposta válida avisando que não achou nada. É preciso checar isso na mão.
Estudar esta lição interativa →Aqui mora a lição mais importante do projeto: quando você busca um CEP que não existe, a ViaCEP responde com sucesso, HTTP 200, exatamente como um CEP válido, só que o corpo da resposta é { "erro": "true" } em vez de um endereço. Repare nas aspas em volta do true: a ViaCEP manda um texto, não um booleano. Do ponto de vista do fetch, isso não é uma falha de rede: a viagem até o servidor deu certo, a resposta chegou, foi convertida para objeto sem problema nenhum. O catch do passo anterior nunca vai perceber esse caso, porque, tecnicamente, nada falhou.
A solução é checar o formato dos dados na mão, logo depois do .json(): if (dados.erro) { ...mostra mensagem de não encontrado... }. Esse if funciona justamente porque um texto não vazio, como "true", conta como "verdadeiro". A tentação de escrever dados.erro === true é o erro clássico deste passo: ele parece certo, mas compara um texto com um booleano, dá false e deixa o CEP inexistente passar como se fosse um endereço. É uma decisão de formato que pertence à API, não ao JavaScript, e cada API tem a sua própria forma de sinalizar "não achei isso". Por isso a tela agora distingue dois problemas bem diferentes: "Falha ao buscar, verifique sua conexão" (a viagem não deu certo) e "Esse CEP não foi encontrado" (a viagem deu certo, mas o destino não existe).
🧩 Este conteúdo é interativo — abra no app para ver e rodar de verdade. Busque um CEP válido, depois um CEP inexistente (ex.: 99999999) e compare as duas mensagens de erro.
É tentador pensar que todo problema de uma requisição cai automaticamente no catch. Não é verdade: o catch só reage a falhas de transporte (sem internet, servidor fora do ar, URL malformada). Uma resposta que chegou perfeitamente bem, mas cujo conteúdo diz "não encontrei nada", é um problema de dado, e cabe ao seu código checar isso explicitamente, olhando para dentro do objeto que voltou.
Se você fez os cursos de HTML, CSS e JavaScript, a página de perfil da Ana tem um formulário de contato. Este buscador cabe nele: um campo de CEP que, ao ser preenchido, completa cidade e estado sozinho. Para tentar, leve limparCep, cepValido e buscarEndereco para o JavaScript do perfil, acrescente o campo de CEP com um label e autocomplete="postal-code", e troque mostrarEndereco por uma função que escreva nos campos de cidade e de estado, sempre com .value ou textContent, nunca com innerHTML.
Seu buscador de CEP valida antes de gastar uma requisição, mostra um estado de carregamento honesto, busca de verdade numa API real e distingue "a internet falhou" de "esse CEP não existe". São exatamente os três estados (carregando, sucesso, erro) que praticamente todo app que conversa com uma API precisa administrar. Como próximo passo por conta própria, tente formatar o CEP digitado automaticamente com um traço (00000-000) enquanto a pessoa digita.