Lançando Erros com o Operador throw - JavaScript
O interpretador de JavaScript lança erros para diversas situações, como ao chamar uma função inexistente ou ao tentar reatribuir um valor a uma constante. No entanto, também podemos lançar nossos próprios erros e definir condições sob as quais os erros serão lançados.
Por exemplo, considere a seguinte situação:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
print() {
console.log(`Name: ${this.name} Age: ${this.age}`);
}
}
const tom = new Person("Tom", -123);
tom.print(); // Name: Tom Age: -123
A classe Person
name
age
Person
Para lançar uma exceção, usamos o operador throw
throw informacaoSobreErro;
As informações sobre o erro podem ser representadas por qualquer objeto.
Então, vamos lançar uma exceção quando um valor negativo for passado para a propriedade age
Person
class Person {
constructor(name, age) {
if (age < 0) throw "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", -123); // Uncaught A idade deve ser positiva
tom.print();
} catch (error) {
console.log("Ocorreu um erro");
console.log(error); // A idade deve ser positiva
}
Consequentemente, ao chamar o construtor de Person
throw
Uncaught A idade deve ser positiva
Como em casos gerais, podemos lidar com esse erro usando um bloco try
catch
Uso do throw em try..catch..finally
O operador throw
try
finally
// classe de um banco de dados fictício
class Database {
constructor() {
this.data = ["Tom", "Sam", "Bob"];
}
// obter dados
getItem(index) {
this.open();
if(index > 0 && index < this.data.length)
return this.data[index];
else
throw "Índice incorreto";
this.close(); // essa linha não será executada se uma exceção for lançada
}
// abrir o banco de dados
open() { console.log("Conexão com o banco de dados estabelecida"); }
// fechar o banco de dados
close() { console.log("Conexão com o banco de dados fechada"); }
}
const db = new Database();
try {
db.getItem(5); // retorna o elemento obtido
} catch(err) {
console.error(err); // se ocorrer um erro, tratamos aqui
}
Neste trecho, a classe Database
data
open
close
open
close
else
throw "Índice incorreto";
this.close(); // essa linha não será executada se uma exceção for lançada
Consequentemente, se um índice incorreto for passado ao método getItem
Conexão com o banco de dados estabelecida Índice incorreto
Mas o que fazer se ainda precisarmos chamar o método close
finally
class Database {
constructor() {
this.data = ["Tom", "Sam", "Bob"];
}
// obter dados
getItem(index) {
this.open();
try {
if(index > 0 && index < this.data.length)
return this.data[index];
else
throw "Índice incorreto";
}
finally { // mesmo que um erro seja lançado, este bloco é executado
this.close(); // essa linha será executada mesmo se uma exceção for lançada
}
}
// abrir o banco de dados
open() { console.log("Conexão com o banco de dados estabelecida"); }
// fechar o banco de dados
close() { console.log("Conexão com o banco de dados fechada"); }
}
const db = new Database();
try {
db.getItem(5); // retorna o elemento obtido
} catch(err) {
console.error(err); // se ocorrer um erro, tratamos aqui
}
E agora o output da console será diferente:
Conexão com o banco de dados estabelecida Conexão com o banco de dados fechada Índice incorreto