Pular para o conteúdo principal

🧠 SQL Não é Código: É Raciocínio (Guia Completo com JOIN e GROUP BY)

Try catch JavaScript

Como usar try e catch com JavaScript — guia prático

Atualizado com as práticas modernas: Optional Catch Binding (ES2019), Error.cause (ES2022), async/await e recomendações de boas práticas de tratamento de erro.

O que é try...catch e quando usar

O try...catch é uma estrutura do JavaScript usada para capturar exceções em tempo de execução — ou seja, pegar erros quando eles ocorrem e reagir de maneira controlada, evitando que a aplicação quebre abruptamente. A construção típica envolve um bloco try (onde você coloca código que pode lançar), um catch (para tratar o erro) e opcionalmente um finally (que roda sempre, mesmo quando há retorno ou exceção).

Sintaxe básica e exemplos

Estrutura mínima:

try {

  // código que pode lançar

} catch (err) {

  // tratamento do erro

} finally {

  // executa sempre (opcional)

}

Exemplo simples:

try {

  const parsed = JSON.parse(userInput);

  console.log(parsed);

} catch (err) {

  console.error("Erro ao parsear JSON:", err.message);

} finally {

  console.log("Tentativa de parse concluída.");

}

O catch recebe o objeto de erro (por convenção chamado err ou error), que tem propriedades como message e stack. Use essas propriedades com parcimônia — a mensagem deve ser clara e útil para depuração.

Optional catch binding (ES2019)

Se você precisa apenas executar lógica quando ocorre um erro, mas não usa o objeto de erro dentro do catch, a partir do ES2019 é permitido omitir a variável de captura:

try {

  doSomething();

} catch {

  // não precisamos do objeto 'err' — apenas tratamos

  cleanup();

}

Esse recurso facilita códigos mais enxutos quando a informação do erro não é necessária para o tratamento. Ferramentas de transpilação (como Babel) e navegadores modernos suportam essa sintaxe.

try com async/await e Promises

Em operações assíncronas, o padrão mais legível hoje é usar async/await. Quando você usa await, coloque-o dentro de um try para capturar rejeições da Promise — caso contrário, uma rejeição não tratada pode interromper o fluxo.

async function fetchUser(id) {

  try {

    const res = await fetch(`/users/${id}`);

    if (!res.ok) throw new Error('Falha na requisição: ' + res.status);

    return await res.json();

  } catch (err) {

    console.error('Erro ao buscar usuário:', err);

    // decidir: tratar, re-lançar ou devolver um valor padrão

    throw err; // rethrow se não puder tratar aqui

  }

}

Para situações em que você quer capturar apenas a Promise específica e continuar sem interromper o restante, prefira isolar o await em seu próprio try ou use promise.then(...).catch(...). Evite blocos try gigantes que englobem muita lógica — isso dificulta entender a origem do erro.

Error.cause e encadeamento de erros (ES2022)

Quando você pega um erro e cria outro (por exemplo, para adicionar contexto), é útil manter a causa original. O padrão moderno é usar a propriedade cause do Error, introduzida no ES2022, que permite encadear erros e preservar informações de diagnóstico.

try {

  await doLowLevel();

} catch (err) {

  throw new Error('Falha ao processar pedido', { cause: err });

}

Ferramentas de logging e observabilidade conseguem ler esse cause para mostrar uma cadeia de falhas — isso melhora muito o diagnóstico em produção.

Boas práticas — o que fazer e o que evitar

Tratar erros corretamente é tanto sobre código quanto sobre decisões de produto. Seguem recomendações práticas:

  • Capture apenas o que você pode tratar: não engula erros silenciando-os sem ação. Se você não tem como resolver no local, registre e re-lance.
  • Use mensagens claras: mensagens de erro devem facilitar a correção (ex.: "Conexão com banco falhou: timeout 5s").
  • Prefira erros customizados quando fizer sentido: crie classes que estendam Error para diferenciar tipos (ex.: ValidationError, NotFoundError).
  • Não abuse de try global: blocos muito grandes tornam difícil achar a origem da falha.
  • Log e monitore: registre stack traces em logs centralizados e configure alertas para erros críticos.
  • Falhas visíveis para o usuário: trate erros esperados (ex.: validação) com mensagens amigáveis; internamente, guarde a stack para devs.
Atenção: nunca exponha stacks ou mensagens técnicas ao usuário final em produção — isso vaza informações sensíveis e superfície de ataque.

Exemplos práticos e padrões recomendados

1) Isolar operações arriscadas

try {

  const users = await getUsers(); // operação segura

  // ... processos que dependem de users

} catch (err) {

  // tratar especificamente a falha de getUsers

  reportError(err);

  // alternativa: fallback para lista vazia

  return [];

}

2) Rethrow com cause para contexto

try {

  const data = await db.query(sql);

} catch (err) {

  throw new DatabaseError('Erro ao executar consulta', { cause: err });

}

3) Erros customizados

class ValidationError extends Error {

  constructor(message, details) {

    super(message);

    this.name = 'ValidationError';

    this.details = details;

  }

}

4) Tratamento em lote com Promise.allSettled

Quando várias promessas podem falhar independentemente, Promise.allSettled permite continuar e inspecionar cada resultado sem abortar tudo com a primeira rejeição.

const results = await Promise.allSettled([op1(), op2(), op3()]);

results.forEach(r => {

  if (r.status === 'rejected') console.error('Falha:', r.reason);

});

Usar allSettled é uma alternativa a envolver tudo num único try, quando cada operação é independente. (Ex.: chamadas paralelas a APIs distintas.)

Resumo rápido / Checklist

  • Use try...catch para código que pode lançar.
  • No catch, trate somente o que conseguir — caso contrário, registre e rethrow.
  • Quando usar await, proteja com try para evitar rejeições não tratadas.
  • Adote Error.cause para encadear causas (ES2022).
  • Use Optional Catch Binding quando não precisar do objeto de erro (ES2019).

Fontes e leitura adicional:

  • Documentação MDN sobre try...catch.
  • Artigo sobre Optional Catch Binding (ES2019).
  • MDN — Error.cause (ES2022).
  • Guias práticos sobre async/await e tratamento de erro.
  • Melhores práticas e recomendações recentes.

Comentários

Postagens mais visitadas deste blog

Tutorial jogo de carro no Flash Mx

Postei recentemente no youtube um vídeo tutorial sobre criação de um game de carro em flash mx, e o usuário: juninhosantosMr reclamou o script, tentei responder mas estava dando erro, então postarei aqui os códigos, seguem abaixo: carro: onClipEvent(load){ speed = 0; } onClipEvent (enterFrame) { if (Key.isDown(Key.UP)) { speed += 0.5; } if (Key.isDown(Key.DOWN)) { speed += -0.2; } if (Math.abs(speed)>10) { speed *= .7; } if (Key.isDown(Key.LEFT)) { _rotation -= 12; } if (Key.isDown(Key.RIGHT)) { _rotation += 12; } speed *= .98; x = Math.sin(_rotation*(Math.PI/180))*speed; y = Math.cos(_rotation*(Math.PI/180))*speed*-1; if (!_root.land3.hitTest(_x+x, _y+y, true)) { _x += x; _y += y; } else { speed *= -.10; } } chegada: onClipEvent (enterFrame) { if (_root.chegou, hitTest(_root.carro)) { _root.gotoAndPlay(2); } } Para acompanhar os três vídeos tutorias: vídeo 1: http://www.youtube.com/watch?v=MYw1H7THo_U&feature=related vídeo 2: ...

🧠 SQL Não é Código: É Raciocínio (Guia Completo com JOIN e GROUP BY)

🧠 SQL Não é Código: É Raciocínio SQL não é sobre escrever código. É sobre pensar em dados. 🔄 A Virada de Chave Resultado → Dados → Filtro → Conexões 🧱 Exemplo id nome cidade 1 João SP 2 Maria RJ SELECT nome FROM clientes WHERE cidade = 'SP'; 🔗 JOIN SELECT clientes.nome, pedidos.valor FROM clientes JOIN pedidos ON clientes.id = pedidos.cliente_id; 📊 GROUP BY SELECT clientes.nome, SUM(pedidos.valor) FROM clientes JOIN pedidos ON clientes.id = pedidos.cliente_id GROUP BY clientes.nome; 💡 Conclusão Você define o resultado. O banco faz o resto. Continuar lendo × Anúncio dos nossos parceiros Fechar e continuar