como fazer o try/catch?
A estrutura try…catch deve ser utilizada em operações que podem falhar para o tratar erros no JavaScript. Quando a falha acontecer, a aplicação tem o controle de como era será tratada, lidando com erros de forma previsível.

Marca um bloco para ser testado (try) e especifica uma solução caso haja uma exceção (catch).
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:
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.
- 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.
Coloca o código que pode causar erros no bloco try
e o código que trata o erro no bloco catch
.
Se ocorre um erro, o JavaScript termina a execução do código e salta para o bloco catch
.
No bloco catch
, você pode acessar um objeto error
(o erro) que contém pelo menos name
(o nome do erro) e message
(a mensagem) que explica o erro em detalhes.
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.
Fluxograma do try catch

A cláusula final (finally)
A finally
é uma cláusula opcional da instrução try...catch
. O código que você colocar no bloco finally
sempre será executado, quer o erro ocorra ou não.
Isso significa que se o códico no bloco try
for executado inteiramente, o código no bloco finally
será executado em seguida. Caso ocorra um erro no bloco try
, executando assim o código do bloco catch
, o código do bloco finally
também será executado.
O fluxograma a seguir ilustra o fluxo da instrução try...catch...finally
:

Tipos de erros no JavaScript
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
O tipo Error
é o tipo base de outros tipos de erros. Vamos examinar em detalhes quando o JavaScript dispara cada tipo de erro.
EvalError
O JavaScript dispara o EvalError
quando você usa eval()
com algo diferente de uma chamada de função, por exemplo;

Erro:

No entanto, os navegadores geralmente disparam o TypeError
em vez de EvalError
nessa situação.
RangeError
O RangeError
ocorre quando um número não está no seu intervalo. Por exemplo:

Erro:

O código no bloco try
causa um RangeError
porque usamos um tamanho inválido para definir um novo array.
ReferenceError
O RefereceError
ocorre quando você faz referência a uma variável, uma função ou um objeto que não existe.

Erro:

Neste exemplo, a variável b
não existe, portanto, causa um ReferenceError
.
SyntaxError
O SyntaxError
ocorre em uma string que você passa para a função eval()
, por exemplo:

Erro:

Fora da função eval()
, o JavaScript para a execução do código sempre que encontrar um SyntaxError
.
TypeError
O TypeError
ocorre quando uma variável é de um tipo inesperado ou acesso a um método inexistente.

Erro:

Neste exemplo, tentamos criar uma nova instância de uma string literal, que causou um erro TypeError
.

Neste exemplo, tentamos acessar o método connect()
do objeto db
, que não existe, portanto ocorreu um erro TypeError
.
URIError
O erro URIError
ocorre ao usar o encodeURI()
ou decodeURI()
com uma URI fora dos padrões, por exemplo:

Disparar erros (Throwing errors)
Para disparar um erro, você usa o operador throw
. Por exemplo:

Sempre que o JavaScript alcançar o operador throw
, ele para a execução do código imediatamente. Para continuar a execução, você precisa usar a instrução try...catch
para capturar o valor que foi lançado. Veja o seguinte exemplo:

Na prática, você deve usar um dos tipos de erros mencionados anteriormente, como um erro a ser lançado, por exemplo:

Erro:

Erros personalizado
Você pode criar um erro personalizado que herda de um erro integrado, como a seguir:

Então, você pode disparar um erro personalizado como mostrado nesse exemplo:

Erro:

Esses e outros detalhes podem ser consultados na documentação oficial do javascript.
Conclusão
O Try Catch é uma excelente forma de se tratar possíveis erros que podem acontecer no sistema. Os erros podem acontecer por vários motivos, e deixar o sistema preparado para isso é muito importante para que não ocorra comportamentos indesejados.
Esse artigo ficou menor que os demais, mas a intenção é tratar situações mais específicas nesse tipo de tema técnico e prático. Tomara que tenha gostado, aplauda o artigo! Até o próximo artigo e ótimos códigos.