programandoai

Código defensivo: validar nas bordas

As melhores mensagens de erro são escritas por você, para o você de daqui a três meses. Validar dados nas bordas do programa e escrever mensagens úteis é o que separa um bug de 5 minutos de um bug de 5 horas.

Estudar esta lição interativa →

Toda função que recebe dados de fora do seu controle direto (o que o usuário digitou, o que uma API devolveu, o que veio de outra parte do sistema) deveria desconfiar deles. Esse hábito tem nome, código defensivo, e a técnica mais eficaz dele é validar nas bordas: checar se o dado está no formato esperado assim que ele entra na sua função, e recusá-lo cedo (com um throw claro) em vez de deixá-lo se espalhar por outras dez funções e só explodir, de forma confusa, lá na frente.

function criarUsuario(nome, idade) {
  if (typeof nome !== "string" || nome.trim() === "") {
    throw new Error("nome é obrigatório e deve ser um texto não-vazio");
  }
  if (typeof idade !== "number" || idade < 0) {
    throw new Error("idade deve ser um número maior ou igual a zero");
  }
  return { nome, idade };
}

try {
  console.log(criarUsuario("Ana", 28));   // ok
  console.log(criarUsuario("", 28));      // lança erro claro
} catch (erro) {
  console.log("Erro:", erro.message);
}

Repare no que faz essas mensagens de erro úteis, e não só presentes: cada uma diz o que estava errado ("idade deve ser um número") e, quando possível, o que se esperava. Uma mensagem como "erro" ou "dados inválidos" não ajuda ninguém a resolver o problema, nem você daqui a três meses, quando já tiver esquecido os detalhes desse código. Uma boa mensagem de erro é, na prática, a primeira pista de uma sessão de debug, e escrevê-la bem economiza tempo de verdade.

Isso também é debug

Quando um erro te deixar travado (e vai acontecer, para todo mundo que programa), um hábito valioso, e que o Tutor IA deste curso reforça bastante, é descrever para si mesmo, em voz alta ou por escrito, o que o código deveria fazer e o que ele está de fato fazendo. A distância entre essas duas frases quase sempre aponta direto para o bug. Mensagens de erro claras (como as desta lição) tornam essa comparação muito mais rápida de fazer.

Defensivo demais também tem custo

Validar tudo, em toda função, o tempo todo, deixa o código inchado e mais difícil de ler, especialmente quando o dado já foi validado uma vez, na borda de entrada do programa. A regra prática: valide com força nas fronteiras (onde o dado externo primeiro chega: um formulário, uma resposta de API, uma função exportada para outras partes do sistema usarem). No miolo do programa, entre funções que você mesmo escreveu e controla, confiar um pouco mais no formato dos dados costuma ser um trade-off saudável.

// Sua vez! Complete a validação nas bordas de criarProduto.
function criarProduto(nome, preco) {
  // valide nome (string não-vazia) e preco (número > 0), lançando Error claros
  // se os dois passarem, retorne { nome, preco }
}

try {
  console.log(criarProduto("Caderno", -5));
} catch (erro) {
  console.log("Erro:", erro.message);
}

Complete a validação nas bordas e clique em Rodar.

← Voltar ao índice do curso