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
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.