← Blog

Try-Catch: O Guarda-Costas do Seu Código (Guia Definitivo)

17 de agosto de 2026programaçãoinicianteserrosdebugging

Erros em programação são inevitáveis. Mais cedo ou mais tarde, seu código vai falhar — seja por um dado incorreto, uma API fora do ar ou um bug que você não previu. O problema não é o erro, é o seu programa quebrando e mostrando uma mensagem grotesca para o usuário. É aqui que o try-catch entra: ele é o guarda-costas que intercepta a exceção antes que ela derrube o sistema.

Neste guia, você vai aprender a usar try-catch na prática, com exemplos reais e funcionais em três linguagens. Sem enrolação, direto ao ponto.

Por que seu programa trava (e como evitar)

Vamos ao cenário clássico: você está lendo um arquivo que pode não existir. Em JavaScript puro, sem proteção, seu código quebra:

const fs = require('fs');

// Sem try-catch: se o arquivo não existir, o processo inteiro morre
const dados = fs.readFileSync('./config.json', 'utf8');
console.log(dados);

Se config.json não estiver lá, o Node.js lança um erro e encerra tudo. Agora com try-catch:

const fs = require('fs');

try {
  const dados = fs.readFileSync('./config.json', 'utf8');
  console.log('Configurações carregadas:', dados);
} catch (erro) {
  console.error('Erro ao ler o arquivo. Usando configurações padrão.');
  // Aqui você pode tomar uma ação alternativa (fallback)
  const dados = '{"tema": "escuro"}';
  console.log('Configurações padrão aplicadas.');
}

Repare: o programa continua rodando, o usuário não vê uma tela vermelha de erro, e você tem controle total sobre o que acontece.

Capturando erros específicos em Python

Python é mais explícito quanto aos tipos de erro. Você pode (e deve) capturar exceções específicas para agir de forma adequada:

try:
    numero = int(input("Digite um número: "))
    resultado = 10 / numero
    print(f"Resultado: {resultado}")
except ZeroDivisionError:
    print("Você tentou dividir por zero. Isso é impossível!")
except ValueError:
    print("Isso não é um número válido. Tente novamente.")
except Exception as erro_inesperado:
    print(f"Erro inesperado: {erro_inesperado}")

Aqui está a sacada: capturar ZeroDivisionError primeiro, depois ValueError, e por último uma exceção genérica. Isso é uma boa prática porque trata os erros que você espera de forma específica e ainda pega os imprevistos.

O bloco finally: o que sempre roda

Em Java (e em outras linguagens), o bloco finally é essencial para recursos como conexões de banco de dados ou arquivos abertos. Ele executa sempre, independente de ocorrer erro ou não:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class ExemploFinally {
    public static void main(String[] args) {
        Connection conexao = null;
        
        try {
            conexao = DriverManager.getConnection("jdbc:mysql://localhost:3306/banco", "usuario", "senha");
            Statement stmt = conexao.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM clientes");
            
            while (rs.next()) {
                System.out.println("Cliente: " + rs.getString("nome"));
            }
        } catch (Exception erro) {
            System.err.println("Erro ao conectar ou consultar: " + erro.getMessage());
        } finally {
            // Este bloco SEMPRE executa, mesmo com erro ou sucesso
            if (conexao != null) {
                try {
                    conexao.close();
                    System.out.println("Conexão encerrada com segurança.");
                } catch (Exception erroFechamento) {
                    System.err.println("Erro ao fechar conexão: " + erroFechamento.getMessage());
                }
            }
        }
    }
}

Sem o finally, se ocorresse um erro na consulta, a conexão nunca seria fechada — um vazamento de recursos que pode travar seu sistema.

Tratamento assíncrono em JavaScript (async/await)

No mundo moderno JavaScript, com funções assíncronas, o try-catch continua sendo sua melhor ferramenta. O problema? Você precisa misturar com async/await corretamente:

async function buscarDadosUsuario(id) {
  try {
    // Simulando uma chamada de API
    const resposta = await fetch(`https://api.exemplo.com/usuarios/${id}`);
    
    if (!resposta.ok) {
      throw new Error(`HTTP ${resposta.status} - Recurso não encontrado`);
    }
    
    const dados = await resposta.json();
    console.log('Usuário encontrado:', dados);
    return dados;
    
  } catch (erro) {
    console.error('Falha na operação:', erro.message);
    // Retorne um valor padrão ou relance para outro nível
    return { id: id, nome: 'Usuário desconhecido' };
  }
}

// Uso
buscarDadosUsuario(123)
  .then(dados => console.log('Resultado final:', dados));

Repare que a função retorna um valor padrão em caso de erro — o código consumidor não precisa saber que houve um problema, mantendo a robustez.

Não faça isso: Anti-padrões com try-catch

Nem tudo são flores. Existem armadilhas comuns que você deve evitar:

# ERRO: Engolindo o erro silenciosamente
try:
    resultado = operacao_risco()
except Exception:
    pass  # Nunca faça isso! Você esconde problemas sérios

# MELHOR: Trate ou pelo menos registre
try:
    resultado = operacao_risco()
except Exception as erro:
    print(f"Falha crítica detectada: {erro}")
    # Ação corretiva ou pelo menos notificação

Outro erro comum é usar try-catch para controle de fluxo normal. Se você está prevendo uma condição, use if/else. try-catch é para exceções — situações inesperadas.

Conclusão: pratique imediatamente

Você acabou de ver try-catch em três linguagens diferentes: JavaScript, Python e Java. A base é sempre a mesma: tente executar, capture o erro, tome uma ação. Bloco finally para recursos, exceções específicas para tratamento fino, e nunca — jamais — engula erros silenciosamente.

Agora, abra seu editor de código e pratique: pegue um script seu que quebra e adicione try-catch em pelo menos três lugares onde você prevê risco. Se precisar de um ambiente gratuito para treinar seus código, o MeuPasso (meupasso.com.br) tem exercícios práticos de programação com feedback automático — ideal para você testar esses conceitos sem dor de cabeça.

Comece com um script simples, quebre-o de propósito, e veja como o try-catch transforma uma falha catastrófica em uma mensagem elegante. É assim que programadores experientes trabalham.