Tipos de Erros - JavaScript
Em um bloco catch
Error
: a mensagem de erromessage
: o tipo de erroname
Vale destacar que diferentes navegadores suportam mais algumas propriedades, mas o comportamento delas pode variar dependendo do navegador:
: o nome do arquivo JavaScript onde o erro ocorreufileName
: a linha no arquivo onde o erro ocorreulineNumber
: a coluna na linha onde o erro ocorreucolumnNumber
: a pilha de errosstack
Vejamos como capturar os dados de um erro, por exemplo, ao chamar uma função inexistente:
try {
callSomeFunc();
{ catch (error) {
console.log("Tipo de erro:", error.name);
console.log("Erro:", error.message);
{
Saída do console:
Tipo de erro: ReferenceError Erro: callSomeFunc is not defined
Lista de Erros
Como vimos acima, o erro lançado pelo interpretador é do tipo Error
ReferenceError
Error
: representa um erro que é lançado ao executar a função globalEvalError
eval()
: um erro é lançado se um parâmetro ou uma variável representa um número que está fora de um intervalo aceitávelRangeError
: um erro é lançado ao tentar acessar uma referência que não existeReferenceError
: representa um erro de sintaxeSyntaxError
: um erro é lançado se o valor de uma variável ou parâmetro representa um tipo incorreto, ou ao tentar modificar um valor que não pode ser alteradoTypeError
: um erro é lançado ao passar valores incorretos às funções encodeURI() e decodeURI()URIError
: fornece um erro que combina várias falhas ocorridasAggregateError
Por exemplo, ao tentar atribuir um valor a uma constante pela segunda vez, um erro do tipo TypeError
try {
const num = 9;
num = 7; // Tentativa de reatribuição
} catch (error) {
console.log(error.name); // TypeError
console.log(error.message); // Assignment to constant variable.
}
Aplicando os Tipos de Erro
Ao lançar erros, podemos utilizar tipos de erro integrados. Por exemplo:
class Person {
constructor(name, age) {
if (age < 0) throw new Error("A idade deve ser positiva");
this.name = name;
this.age = age;
}
print() { console.log(`Name: ${this.name} Age: ${this.age}`); }
}
try {
const tom = new Person("Tom", -45);
tom.print();
}
catch (error) {
console.log(error.message); // A idade deve ser positiva
}
Aqui, o construtor da classe Person
Error
Error
if (age < 0) throw new Error("A idade deve ser positiva");
Assim, ao processar a exceção no bloco catch
Todos os outros tipos de erro também aceitam uma mensagem de erro como primeiro parâmetro no construtor. Vamos lançar alguns tipos de erros:
class Person {
constructor(pName, pAge) {
const age = parseInt(pAge);
if (isNaN(age)) throw new TypeError("A idade deve ser um número");
if (age < 0 || age > 120) throw new RangeError("A idade deve ser maior que 0 e menor que 120");
this.name = pName;
this.age = age;
}
print() { console.log(`Name: ${this.name} Age: ${this.age}`); }
}
try {
const tom = new Person("Tom", -45);
}
catch (error) {
console.log(error.message); // A idade deve ser maior que 0 e menor que 120
}
try {
const bob = new Person("Bob", "bla bla");
}
catch (error) {
console.log(error.message); // A idade deve ser um número
}
try {
const sam = new Person("Sam", 23);
sam.print(); // Name: Sam Age: 23
}
catch (error) {
console.log(error.message);
}
Saída no console:
A idade deve ser maior que 0 e menor que 120 A idade deve ser um número Name: Sam Age: 23
Nesse exemplo, como a idade pode ser qualquer valor, inicialmente tentamos convertê-la em um número usando a função parseInt()
const age = parseInt(pAge);
if (isNaN(age)) throw new TypeError("A idade deve ser um número");
Em seguida, com a função isNaN(age)
TypeError
Depois verificamos se o número está dentro do intervalo aceitável. Se não estiver, lançamos um erro do tipo RangeError
if (age < 0 || age > 120) throw new RangeError("A idade deve ser maior que 0 e menor que 120");
Tratando Múltiplos Tipos de Erro
Quando executamos o mesmo código, podem ser lançados erros de diferentes tipos. E às vezes é necessário distinguir entre os tipos de tratamento. Neste caso, podemos verificar o tipo de erro que ocorreu. Por exemplo, o exemplo acima com a classe Person
class Person {
constructor(pName, pAge) {
const age = parseInt(pAge);
if (isNaN(age)) throw new TypeError("A idade deve ser um número");
if (age < 0 || age > 120) throw new RangeError("A idade deve ser maior que 0 e menor que 120");
this.name = pName;
this.age = age;
}
print() { console.log(`Name: ${this.name} Age: ${this.age}`); }
}
try {
const tom = new Person("Tom", -45);
const bob = new Person("Bob", "bla bla");
}
catch (error) {
if (error instanceof TypeError) {
console.log("Tipo de dado incorreto.");
} else if (error instanceof RangeError) {
console.log("Valor inaceitável");
}
console.log(error.message);
}
Criando Seus Próprios Tipos de Erro
Não estamos limitados apenas aos tipos de erro integrados e podemos criar nossos próprios tipos de erro para situações específicas. Por exemplo:
class PersonError extends Error {
constructor(value, ...params) {
super(...params);
this.name = "PersonError";
this.argument = value;
}
}
class Person {
constructor(pName, pAge) {
const age = parseInt(pAge);
if (isNaN(age)) throw new PersonError(pAge, "A idade deve ser um número");
if (age < 0 || age > 120) throw new PersonError(pAge, "A idade deve ser maior que 0 e menor que 120");
this.name = pName;
this.age = age;
}
print() { console.log(`Name: ${this.name} Age: ${this.age}`); }
}
try {
const bob = new Person("Bob", "bla bla");
}
catch (error) {
if (error instanceof PersonError) {
console.log("Erro do tipo Person. Valor incorreto:", error.argument);
}
console.log(error.message);
}
Saída no console:
Erro do tipo Person. Valor incorreto: bla bla A idade deve ser um número
O tipo de erro PersonError
Error
class PersonError extends Error {
constructor(value, ...params) {
super(...params);
this.name = "PersonError";
this.argument = value;
}
}
No construtor, definimos uma propriedade adicional chamada
value
this.name
Na classe Person
PersonError
if (isNaN(age)) throw new PersonError(pAge, "A idade deve ser um número");
if (age < 0 || age > 120) throw new PersonError(pAge, "A idade deve ser maior que 0 e menor que 120");
Depois, ao tratar a exceção, podemos verificar o tipo e, se for um PersonError
argument
catch (error) {
if (error instanceof PersonError) {
console.log("Erro do tipo Person. Valor incorreto:", error.argument);
}
console.log(error.message);
}