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.