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
}
  • try: comandos/invocações de métodos que podem gerar uma situação de exceção.
  • catch: bloco executado em caso de exceção no bloco try.

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.