JavaScript:
Tratamento de erros

Como fazer:

Aqui está o clássico bloco try-catch:

try {
  // Código que pode lançar um erro
  let result = potentiallyRiskyOperation();
  console.log('Sucesso:', result);
} catch (error) {
  // O que fazer se um erro for lançado
  console.error('Ops:', error.message);
}

Saída de exemplo quando nenhum erro ocorre:

Sucesso: 42

E quando há um erro:

Ops: Algo deu errado

Para código assíncrono, onde promessas estão envolvidas, use try-catch em uma função async:

async function fetchData() {
  try {
    let data = await fetch('https://api.example.com/data');
    console.log('Dados obtidos:', data);
  } catch (error) {
    console.error('Erro ao obter dados:', error.message);
  }
}

fetchData();

Aprofundando

O tratamento de erros em JavaScript evoluiu. Lá atrás (ES3, cerca de 1999), tínhamos apenas o bloco try-catch. Não era super flexível, mas fazia o trabalho.

ES6 (2015) introduziu Promessas e nos deu .then() e .catch(), permitindo-nos tratar erros assíncronos de forma mais elegante.

fetch('https://api.example.com/data')
  .then(data => console.log('Dados obtidos:', data))
  .catch(error => console.error('Erro ao obter dados:', error.message));

Quanto aos detalhes de implementação, quando um erro é lançado, os motores JavaScript criam um objeto Error com propriedades úteis como message e stack. Você também pode criar tipos de erros personalizados estendendo a classe Error – útil para aplicativos mais complexos.

Alternativas? Você poderia ignorar o tratamento de erros (má ideia), usar callbacks com parâmetros que priorizam erros (olá, estilo Node.js), ou ser mais sofisticado com bibliotecas e frameworks que oferecem suas próprias soluções.

Veja Também

Para mais informações sobre tratamento de erros: