Categorias do Site

Como usar try…catch em JavaScript

Aprenda a usar try...catch em JavaScript para lidar com erros e melhorar a experiência do usuário.

Um círculo amarelo com

Construir aplicações JavaScript envolve antecipar e lidar com problemas inesperados. Os erros são inevitáveis, mas gerenciá-los efetivamente garante uma melhor experiência do usuário. O JavaScript oferece o bloco try…catch como uma maneira estruturada de lidar com erros de forma elegante.

Como Usar Try...catch Para Tratamento de Erros em JavaScript

Este artigo explora como usar o bloco try…catch, abordando sua sintaxe básica e cenários avançados, como blocos aninhados, lançamento de erros e tratamento de código assíncrono.

A sintaxe básica de try...catch

A instrução try...catch consiste em três partes principais:

  • Um bloco try — Contém o código que pode gerar um erro
  • Um bloco catch — Lida com um erro se ocorrer. É executado apenas quando um erro é gerado
  • Um bloco finally — Executa o código de limpeza. Ele é executado independentemente de um erro ser gerado ou não

O bloco try deve ser seguido por um bloco catch ou finally, ou ambos, como mostrado abaixo:

    // try...catch
    try{
    console.log("executando bloco try...")
    console.log(missingVar)
    }catch{
    console.log("ocorreu um erro")
    }
    
    // SAÍDA:
    // executando bloco try...
    // ocorreu um erro


    // try...finally
    try{
    console.log("executando bloco try...")
    }finally{
    console.log("declaração final")
    }
    
    // SAÍDA:
    // executando bloco try...
    // declaração final


    // try...catch...finally
    try{
    console.log("executando bloco try...")
    console.log(missingVar)
    }catch(errorVar){
    console.log("ocorreu um erro",errorVar)
    }finally{
    console.log("declaração final")
    }
    
    // SAÍDA:
    // executando bloco try...
    // ocorreu um erro
    // declaração final

O bloco catch possui um identificador de erro que pode ser usado para acessar o erro gerado. Você pode acessá-lo como um todo (por exemplo, errorVar) ou usar suas propriedades individualmente:

  • errorVar.name – Especifica o tipo de erro
  • errorVar.message – Fornece uma descrição do erro legível para humanos

O trecho de código abaixo usa desestruturação para acessar o erro gerado:

    try {
        console.log(missingVar)
    } catch ({name, message}) {
        console.log("nome: ", name)
        console.log("mensagem: ", message)
    }
    
    // SAÍDA:
    // nome:  ReferenceError
    // mensagem:  missingVar não está definida

Lançando erros personalizados

Às vezes, erros embutidos como TypeError não capturam completamente o que deu errado. Lançar erros personalizados permite fornecer mensagens de erro mais claras e incluir informações adicionais para depuração.

Para criar um erro personalizado, você estende a classe Error, define um construtor que define uma mensagem de erro significativa e atribui um nome personalizado. Você pode opcionalmente incluir informações adicionais de depuração e capturar o rastreamento de pilha original para depuração no desenvolvimento:

class OperationError extends Error {
/**
* Erro personalizado para lidar com falhas de operação.
* @param {string} resource - O recurso envolvido no erro.
* @param {string} action - A ação que falhou.
*/
constructor(resource, action) {
// Construa uma mensagem de erro significativa
super(`Falha ao ${action} ${resource}. Verifique o recurso e tente novamente.`);
// Preserve o rastreamento de pilha original (opcional, útil para depuração)
if (Error.captureStackTrace) {
Error.captureStackTrace(this, OperationError);
}
this.name = "OperationError";
// Informações de depuração personalizadas
this.resource = resource;
this.action = action;
}
}

No trecho de código abaixo, o erro personalizado é lançado no bloco try para simular uma chamada de função que pode encontrar esse tipo específico de erro. O objeto de erro inclui o rastreamento de pilha e propriedades adicionais de erro:

    
try {
    // simular uma operação que pode lançar uma exceção
      throw new OperationError("arquivo", "ler");
    } catch (error) {
      console.error(`${error.name}: ${error.message}`);
    
      console.log(`informações adicionais: o recurso era um ${error.resource} e a ação era ${error.action}`)
    
      console.log(error)
    }
    
    // SAÍDA:
    // OperationError: Falha ao ler o arquivo. Verifique o recurso e tente novamente.
    
    // informações adicionais: o recurso era um arquivo e a ação era ler
    
    // OperationError: Falha ao ler o arquivo. Verifique o recurso e tente novamente.
    //     at Object.< anonymous > (/Users/walobwa / Desktop /project / test.js: 25: 11)
    //     at Module._compile(node: internal / modules / cjs / loader: 1376: 14)
    //     at Module._extensions..js(node: internal / modules / cjs / loader: 1435: 10)
    //     at Module.load(node: internal / modules / cjs / loader: 1207: 32)
    //     at Module._load(node: internal / modules / cjs / loader: 1023: 12)
    //     at Function.executeUserEntryPoint[as runMain](node: internal/modules/run_main: 135: 12)
    //     at node: internal / main / run_main_module: 28: 49 {
    //     resource: 'arquivo',
    //         action: 'ler'
    // }

Blocos catch condicionais

Blocos catch condicionais usam a instrução if...else para lidar com erros específicos, permitindo que os inesperados sejam propagados.

Conhecer os diferentes tipos de erros que podem ser lançados ao executar o código ajuda a lidar com eles adequadamente. Usando instanceof, podemos capturar erros específicos como OperationError e fornecer uma mensagem significativa para o erro:

    try {
    // simular uma operação que pode lançar uma exceção
        throw new OperationError("arquivo", "ler"); 
    } catch (error) {
        if (error instanceof OperationError) {
    // lidar com erro esperado
            console.error("Erro de Operação encontrado:", error.message);
        } else {
    // registrar erro inesperado
            console.error("Erro inesperado encontrado:", error.message);
        }
    }
    // SAÍDA:
    // Erro de Operação encontrado: Falha ao ler o arquivo. Verifique o recurso e tente novamente.

No trecho de código acima, registramos qualquer outro erro na instrução else. Uma boa prática seria relançar erros não explicitamente tratados no bloco try...catch.

Relançando erros

Relançar erros garante que eles sejam propagados para cima na pilha de chamadas para tratamento. Isso evita falhas silenciosas e mantém o rastreamento de pilha.

No trecho de código abaixo, capturamos o erro esperado, OperationError, silenciamos e, em seguida, adiamos o tratamento de outros erros relançando-os. A função de nível superior agora lidará com o erro relançado:

    try {
        throw new TypeError("X não é uma função"); 
    } catch (error) {
        if (error instanceof OperationError) {
            console.error("Erro de Operação encontrado:", error.message);
        } else {
        throw error; // relançar o erro inalterado
        }
    }

Bloco try…catch aninhado

Um bloco try...catch aninhado é usado quando uma operação dentro de um bloco try requer tratamento de erro separado. Ele ajuda a gerenciar várias falhas independentes, garantindo que uma falha não interrompa todo o fluxo de execução.

Erros no bloco interno são capturados e tratados localmente enquanto o bloco externo gerencia erros não tratados ou propagados. Se o erro gerado for tratado no bloco interno try..catch, o bloco catch externo não é executado:

    try {
        try {
            throw new OperationError("arquivo", "ler");
        } catch (e) {
            if (e instanceof OperationError) {
                console.error("Erro de Operação encontrado:", e.message);
            } else {
                throw e; // relançar o erro inalterado
            }
        } finally {
            console.log("bloco finalmente interno");
        }
    } catch (err) {
        console.error("registro de erro externo", err.message);
    }
    // SAÍDA:
    // Erro de Operação encontrado: Falha ao ler o arquivo. Verifique o recurso e tente novamente.
    // bloco finalmente interno

Se um erro não for tratado ou for relançado no bloco interno, o bloco try...catch externo o captura. O bloco finally aninhado é executado antes do bloco catch ou finally externo, garantindo a limpeza em cada nível:

    try {
        try {
            throw new TypeError("arquivo");
        } catch (e) {
            if(e instanceof OperationError) {
                console.error("Erro de Operação encontrado:", e.message);
            } else {
                throw e; // relançar o erro inalterado
            }
        } finally {
            console.log("bloco finalmente interno");
        }
    } catch (err) {
        console.error("registro de erro externo", err.message);
    }
    // SAÍDA:
    // bloco finalmente interno
    // registro de erro externo arquivo

Lidando com erros assíncronos

try...catch funciona com código síncrono. Quando um erro ocorre dentro de uma função assíncrona, o bloco try...catch conclui a execução antes que o erro ocorra, deixando-o não tratado.

Operações assíncronas requerem tratamento de erro adequado para evitar rejeições não tratadas e falhas inesperadas. Usar try...catch com async/await ajuda a evitar que rejeições não tratadas passem despercebidas.

async/await garante que o bloco try…catch espere o resultado da operação assíncrona antes de prosseguir:

    async function openFile(url) {
        try {
            const response = await fetch(url);
            if (!response.ok) {
                throw new OperationError("arquivo", "abrir"); // Reutilizando OperationError para lidar com erros de abertura de arquivo
            }
            return await response.json();
        } catch (error) {
            console.error(`Falha ao buscar arquivo: ${error.message}`);
            // Relançar ou lidar de forma graciosa
            throw error; // Propagar o erro para cima
        }
    }

No exemplo acima, a função openFile é assíncrona. O resultado da operação fetch é aguardado. Se um erro for lançado, ele é registrado e propagado para o bloco try...catch externo onde é tratado:

    try {
        const data = await openFile("data.json");
        console.log(data);
    } catch (error) {
        console.error(`Falha ao abrir arquivo: ${error.message}`);
    }
   

Usando finally para limpeza

O bloco finally em uma instrução try...catch é usado para executar código que deve ser executado independentemente de um erro ocorrer. Isso é útil para operações de limpeza, como fechar arquivos, liberar recursos ou redefinir estados:

    try {
        // operação que abre arquivo e lança erro de operação
        throw new OperationError("arquivo", "ler");
    } catch (error) {
       if(error instanceof OperationError) {
           console.error(`Erro de operação: ${error.message}`);
       } else {
           throw error;
       }
    } finally {
        closeFile(file); // Garante que o arquivo seja fechado mesmo que ocorra um erro
    }

Conclusão

Este tutorial explorou o tratamento de erros em JavaScript usando o bloco try...catch. Abordamos sua sintaxe básica, lançamento de erros personalizados, relançamento de erros e uso de blocos aninhados. Também discutimos o tratamento de erros assíncronos com try...catch e async/await, bem como o uso do bloco finally para limpeza de código.

Ao usar efetivamente try...catch, os desenvolvedores podem construir aplicações mais robustas, prevenir falhas inesperadas e melhorar a depuração, garantindo uma melhor experiência do usuário.

  • Problemas com React Server Components

    Descubra os desafios e surpresas ao usar React Server Components em projetos reais.

    Descubra os desafios e surpresas ao usar React Server Components em projetos reais.

    Ler notícia completa
    Ícone de átomo neon azul-ciano flutuando sobre fundo roxo com linhas e pontos brilhantes, sugerindo um ambiente digital ou espaço cósmico.
  • Chave para IA Geral: Anotação Ética é Essencial

    Anotação ética é crucial para a IA Geral, garantindo respeito aos anotadores e criando consciências justas.

    Anotação ética é crucial para a IA Geral, garantindo respeito aos anotadores e criando consciências justas.

    Ler notícia completa
    Ilustração estilizada de quatro pessoas trabalhando em computadores, com um fundo de rede neural e um documento flutuante à direita, em tons azuis e laranja.
  • Como reduzir a troca de tarefas no design UX

    Descubra como otimizar a experiência do usuário reduzindo a troca de tarefas em plataformas digitais complexas.

    Descubra como otimizar a experiência do usuário reduzindo a troca de tarefas em plataformas digitais complexas.

    Ler notícia completa
    Ícone de personagem estilizado, parecido com um boneco, segurando um laptop e um celular, com um balão de fala acima, sobre um fundo abstrato cintilante e colorido.
  • Confissões de um Generalista em Web Design

    Existe um tipo especial de designer web por aí. Eles são os generalistas, aqueles que fazem a internet moderna funcionar, muitas vezes sem reconhecimento. Bem-vindo ao Multiverso de Você Você sabe quem é. Você projeta o site, constrói, escreve o texto quando ninguém mais aparece. Você lida com o CMS e descobre por que o […]

    Descubra o papel crucial do generalista em web design e sua habilidade única de gerenciar caos e criar soluções.

    Ler notícia completa
    Homem surpreso com cabelo despenteado e óculos redondos segura uma caneca e cabos, cercado por coloridos papéis adesivos em fundo laranja e verde.
  • Roteamento de IA: Apps mais inteligentes com SDK

    Se você está desenvolvendo aplicações de IA, provavelmente está lidando com mais de um modelo de linguagem em sua aplicação: GPT-4 para tarefas gerais, Claude para codificação ou até mesmo o mais recente Nano Banana para geração de imagens. Durante o desenvolvimento, você pode querer experimentar modelos de código aberto localmente, caso seu hardware suporte. […]

    Aprenda a usar o roteamento de modelos sensível ao ambiente para criar apps de IA mais eficientes com o AI SDK.

    Ler notícia completa
    Círculo preto central com um triângulo branco sobre fundo que se assemelha a uma nuvem rosa gradientemente colorida.
  • Práticas de segurança para projetos com IA

    Assistentes de código com IA são comuns em IDEs devido à produtividade que trazem, mas uma pesquisa de Stanford revelou que desenvolvedores com assistência de IA tendem a criar códigos menos seguros. Para proteger um fluxo de trabalho assistido por IA, é necessário adotar uma disciplina ativa e multifacetada. Este artigo apresenta um guia prático […]

    Descubra práticas essenciais para proteger projetos gerados por IA e evitar vulnerabilidades comuns.

    Ler notícia completa
    Ilustração de um labirinto estilizado em tons de roxo e azul, com um grande símbolo de cadeado roxo no centro, representando segurança ou privacidade.
  • Interfaces de Voz e Imersão: Futuro da Experiência UX

    “As tecnologias mais profundas são aquelas que desaparecem. Elas se integram ao tecido da vida cotidiana até se tornarem indistinguíveis dela.” — Mark Weiser Seus usuários já estão interagindo com dispositivos por voz. Nos EUA, 62% dos adultos usam assistentes de voz, enquanto 42% das famílias no Reino Unido possuem dispositivos com essa funcionalidade. Eles […]

    Prepare seu produto para o futuro das interfaces de voz e imersão, que estão transformando a interação digital.

    Ler notícia completa
    Design gráfico com fundo azul escuro apresentando as palavras
  • Por que PMs e designers precisam de ambiente AI

    Resumo Executivo Agentes de IA estão avançando de protótipos para produção, mas muitos falham sem a base correta: um ambiente de execução de agentes de IA. Pesquisas do MIT revelam que 95% dos testes de IA generativa não geram impacto mensurável. A Forbes destaca que dados fragmentados e sinais conflitantes condenam a maioria dos pilotos, […]

    Ambiente de execução AI é essencial para sucesso de projetos, evitando falhas de integração e otimizando processos.

    Ler notícia completa
    Pintura abstrata de um horizonte de cidade com edifícios coloridos sob um céu geométrico dividido em seções coloridas com linhas conectando pontos.
  • Melhores Modelos de Relatórios para InDesign e Photoshop

    Relatórios empresariais podem abranger uma ampla gama de usos, desde grandes relatórios anuais até folhas de produtos de uma página. Criar um design detalhado do zero pode ser demorado. Como equilibrar eficiência e estética? Os modelos de relatórios empresariais e corporativos desta coleção são a solução ideal. Eles são pré-desenhados, personalizáveis e compatíveis com aplicativos […]

    Descubra modelos de relatórios empresariais para InDesign e Photoshop em 2025. Otimize seus designs e economize tempo.

    Ler notícia completa
    Diversas páginas de um relatório corporativo abertas, mostrando gráficos, fotos e textos sobre negócios e finanças, em design moderno e limpo.