Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 10 – API JavaScript, Node.js e Express – Error Handling Patterns – try/catch, throw, custom errors

Imagem destacada da aula de API

Introdução (3 min)

Imagine um restaurante. Um cliente pede um prato que não está no cardápio. O que acontece? O garçom, em vez de entrar em pânico, educadamente informa ao cliente sobre a indisponibilidade do prato. Esse é o tratamento de erros, fundamental para uma boa experiência. Em APIs, é vital lidar com situações inesperadas de forma elegante e informativa, evitando quebras e garantindo a continuidade do serviço. Nesta aula, você dominará as técnicas essenciais de tratamento de erros em Node.js e Express, usando try/catch, throw, e erros customizados, preparando-se para construir APIs robustas e resilientes.

No contexto de Node.js/Express, o tratamento de erros é ainda mais relevante devido à natureza assíncrona da plataforma. Saber lidar com erros garante a estabilidade da sua aplicação, mesmo sob grande pressão.

Conceito Fundamental (7 min)

O tratamento de erros é o processo de antecipar, detectar e responder a condições excepcionais que podem interromper o fluxo normal de uma aplicação. Usamos try/catch para encapsular código que pode gerar erros. O bloco try contém o código a ser monitorado, e o bloco catch captura e lida com qualquer erro que ocorra dentro do try. A palavra-chave throw permite lançar erros explicitamente, sinalizando situações problemáticas. Erros customizados são uma maneira poderosa de criar tipos específicos de erros, tornando a depuração e o tratamento mais precisos.

Em produção, o tratamento de erros possibilita o registro (logging) de erros para análise posterior, a exibição de mensagens amigáveis ao usuário, e a recuperação da aplicação em caso de falhas. Integra-se com tecnologias de logging, monitoramento, e frameworks web como o Express.js. A principal vantagem é a robustez, enquanto a desvantagem pode ser um pequeno overhead de performance, insignificante na maioria dos casos.

Implementação Prática (10 min)

const express = require('express');
const app = express();

// Middleware para simular uma operação que pode falhar const operacaoAssincrona = (req, res, next) => { try { // Simulando uma busca em um banco de dados const resultado = null; // Simulando um resultado nulo (erro)

if (!resultado) { // Lançando um erro customizado const erro = new Error('Recurso não encontrado'); erro.status = 404; throw erro; }

res.locals.resultado = resultado; // Armazenando o resultado next(); // Passando para o próximo middleware } catch (err) { console.error('Erro na operação assíncrona:', err); // Logging profissional next(err); // Passando o erro para o manipulador de erros global } };

app.get('/recurso', operacaoAssincrona, (req, res) => { res.json(res.locals.resultado); });

// Manipulador de erros global app.use((err, req, res, next) => { res.status(err.status || 500); // Definindo o código de status res.json({ erro: err.message }); // Retornando uma resposta JSON com a mensagem de erro });

app.listen(3000, () => console.log('Servidor rodando na porta 3000'));


Instalação das dependências (apenas uma vez):

📚 Informações da Aula

Curso: API Completo - Node.js & Express

Tempo estimado: 25 minutos

Pré-requisitos: JavaScript básico

npm init -y npm install express

Executar o servidor

node index.js

Este código demonstra o uso de try/catch, throw, e um manipulador de erros global. O middleware operacaoAssincrona simula uma operação que pode falhar, lançando um erro customizado com status 404. O manipulador de erros global captura qualquer erro e retorna uma resposta JSON com o código de status e a mensagem de erro.

Exercício Hands-On (5 min)

Crie uma rota /usuario que busca um usuário por ID. Simule um banco de dados com um array de usuários. Se o usuário não for encontrado, lance um erro customizado UsuarioNaoEncontrado com status 404 e mensagem personalizada. Implemente um manipulador de erros global para tratar esse erro e outros erros que possam ocorrer.

Solução:

// ... (código anterior)

class UsuarioNaoEncontrado extends Error { constructor(message) { super(message); this.name = 'UsuarioNaoEncontrado'; this.status = 404; } }

app.get('/usuario/:id', (req, res, next) => { const usuarios = [{ id: 1, nome: 'Alice' }, { id: 2, nome: 'Bob' }]; const usuario = usuarios.find(u => u.id === parseInt(req.params.id)); if (!usuario) { throw new UsuarioNaoEncontrado('Usuário não encontrado'); } res.json(usuario); });

// ... (manipulador de erros global - já implementado anteriormente)

Para testar, faça uma requisição para /usuario/3. Você deve receber uma resposta JSON com status 404 e a mensagem “Usuário não encontrado”. Para outros IDs (1 e 2), você receberá os dados do usuário correspondente. Lembre-se de usar o console.error para registrar os erros de forma profissional. Experimente outras variações e cenários para consolidar seu aprendizado. A partir daqui, explore a documentação oficial do Express.js para aprofundar seus conhecimentos sobre middlewares e tratamento de erros.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas