JavaScript: try...catch

A estrutura try...catch deve ser utilizada em operações que podem falhar. Assim, quando a falha acontece a aplicação tem o controle de como era será tratada. Aprenda sobre ela aqui.

Marca um bloco para ser testado (try) e especifica uma solução caso haja uma exceção (catch).

Visão geral

Um bloco try é considerado protegido porque, caso ocorra algum tipo de problema nos comandos dentro do bloco, sua execução será desviada para o bloco catch.

Por exemplo, considere que seja necessário efetuar a conversão de um JSON em um objeto, porém seu conteúdo contem algum erro de sintaxe, como podemos ver abaixo:

try { JSON.parse("{ json com erros }"); } catch (e) { console.log(e.message) // Unexpected token n in JSON at position 2 }

Ao invés de ser gerada uma falha no software, o erro foi direcionado ao bloco catch onde é possível trata-lo e fazer algum tipo de correção ou processo especifico para que o sistema continue funcionando.

Sintaxe

try { // código que inclui comandos/invocações de métodos // que podem gerar uma situação de exceção. } catch (variavel-com-a-excessap) { // bloco de tratamento da falha associado a classe Error }

Na prática

Exemplo 1

Considere que seja necessário converter um JSON em um objeto como é feito no exemplo abaixo para que seja possível acessar informações como o nome do usuário.

try { const json = '{ nome: "Bruno", "dataNascimento": "09061993" }' const user = JSON.parse(json) console.log(user.nome) // Bruno } catch (e) { console.log(e.message) // Unexpected token n in JSON at position 2 }

Exemplo 2

Neste exemplo e feita a validação de um cpf a partir da função cpfIsValido, perceba que quando e passado um numero invalido para a função é gerado uma exceção, que podemos ver melhor abaixo:

/** * valida se um número de cpf é valido * * @example cpfIsValido("999.999.999-99") * * @param numero * @returns */ function cpfIsValido (numero) { /** * @type expressão regular para validar o número de cpf */ const pattern = /^\d\.\d\.\d\-\d$/ // se o valor passado não cumprir com o padrão da expressão regular // é gerada uma exceção if (!pattern.test(numero)) { throw new Error('cpf escrito com um padrão não aceito') } // retorna apenas os número do cpf return numero.replace(/\D/g, '') } try { console.log(cpfIsValido('999.999.99999')) } catch (err) { console.log(err.message) // cpf escrito com um padrão não aceito }

Entre as linhas 25 e 30 e executada a função cpfIsValido dentro do bloco try porém o número de cpf foi digitado, caso esteja errado a função irá gerar uma exceção e cair no bloco catch, no caso do bloco e porque ao invés do cpf estar escrito com o padrão 999.999.999-99 o traço foi omitido.

Exemplo 3

Em um software podemos gerar exceções em determinados blocos do código para serem tratadas posteriormente, no exemplo abaixo veremos como causar e tratar um Error no código.

try { const isAutenticado = logIn(email, senha) if (!isAutenticado) { throw new Error('E-mail ou senha inválidos') } } catch (err) { window.alert(err.message) // E-mail ou senha inválidos }

Entre as linhas 2 e 6 temos o corpo do try onde a função logIn verifica o email e senha de um usuário e retorna um valor booleano informando se o mesmo está autenticado, em caso negativo será gerada uma exceção na linha 5, perceba que é utilizado a palavra reservada throw e em seguida new Error onde é informado o motivo da exceção.

Ao ocorrer uma falha no login e exibido um pop-up na tela onde é exibida a mensagem da exceção, desta forma é possível criar fluxos alternativos no código em caso de falha.

Exemplo 4: Tratando falha ao tentar ler arquivo inexistente no Node.js

No Node.js é possível ler e manipular arquivos armazenados na maquina em que ele esta sendo executado, para isso utilizamos o módulo nativo fs. Neste exemplo fazemos a leitura de um arquivo de texto que não existe gerando um erro que é tratado pelo try...catch.

const fs = require('fs') try { const data = fs.readFileSync('./index.html', { encoding: 'utf8' }) // alguma logica da aplicação } catch (err) { console.log(err.message) // ENOENT: no such file or directory, open 'index.html' }

Na linha 1 importamos o módulo fs e em seguida entre as linhas 4 e 6 e executada a logica de negocio da aplicação, entretanto ao tentar ler um arquivo inexistente na linha 4 é gerada uma exceção que direciona o fluxo da aplicação para o bloco catch entre as linhas 8 e 9.

Exemplo 5: Tratando falha ao tentar excluir um arquivo inexistente no Node.js

No exemplo abaixo utilizamos o módulo fs para excluir um arquivo inexistente gerando uma falha que precisa ser tratada dentro do bloco try..catch.

const fs = require('fs') try { fs.unlinkSync('index.html') console.log('Arquivo excluído!') // alguma lógica da aplicação } catch (err) { console.log(err.message) // ENOENT: no such file or directory, unlink 'index.html' }

Na linha 1 é importado o módulo fs responsável por manipular arquivos no Node.js, em seguida entre as linhas 4 e 8 e executada a lógica da aplicação, porém ao tentar excluir um arquivo inexistente (index.html) o bloco de código gera um erro caindo no bloco catch entre as linhas 10 e 11.

Compatibilidade

Engine Versão Minima
Node.JS ( V8) 6.4.0
Safari ( WebKit) 11.1
Chrome ( V8) 68
Microsoft Edge ( ChakraCore) 17
Firefox ( Gecko) 61

Nota: O Opera utiliza atualmente grande parte do código do Chrome como base para o seu próprio desenvolvimento e por isso ele não é mencionado nesta listagem.

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados