Os erros são úteis para assinalar quando algo corre mal ou acontece algo inesperado num programa ou num excerto de código.
São objetos JavaScript.
A principal propriedade deste objeto é message:
const error = new Error('Oops, something went wrong');
console.log(error.message);
// => "Oops, something went wrong"
Com a sintaxe throw, podes lançar um erro.
throw new Error('Oops');
Quando um erro é lançado, a execução atual é interrompida e retoma no primeiro bloco catch da pilha de chamadas.
try {
throw new Error('Oops');
} catch (error) {
console.log(error.message);
// => "Oops"
}
A herança é uma forma de criar relações pai-filho entre classes. A classe filha (por vezes designada subclasse) tem acesso ao comportamento e aos dados definidos pela classe pai (por vezes designada superclasse).
class Pet {
constructor(name) {
this.name = name;
}
introduce() {
console.log(`This is my pet, ${this.name}.`);
}
}
class Dog extends Pet {}
const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.
A palavra-chave extends na declaração da classe filha estabelece uma relação com a classe pai através da cadeia de protótipos.
Os objetos criados pelo construtor da classe filha terão o protótipo da classe pai na sua cadeia de protótipos, o que dá acesso a quaisquer métodos ou dados definidos pela classe pai.
const dog = new Dog('Otis');
Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true
Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false
Tal como acontece com qualquer classe em JavaScript, as subclasses podem herdar de Error para criar erros personalizados com a palavra-chave extends.
A sintaxe instanceof verifica se o erro capturado é uma instância de uma determinada subclasse de Error.
class CustomError extends Error {}
try {
// ... Code that may throw an error
} catch (error) {
if (error instanceof CustomError) {
console.log('The error thrown is an instance of the CustomError');
}
}
A Elena é a nova responsável pela qualidade de uma fábrica de jornais. Como acabou de chegar à empresa, decidiu analisar alguns dos processos da fábrica para ver o que poderia ser melhorado. Descobriu que os técnicos fazem muitos controlos de qualidade à mão. Vê aí uma boa oportunidade de automatização e pede-te a ti, um programador independente, para desenvolveres um software que monitorize algumas das máquinas.
A tua primeira missão é escrever um software para monitorizar o nível de humidade da sala de produção. Já existe um sensor ligado ao software da empresa que devolve periodicamente a percentagem de humidade da sala.
Precisas de implementar uma função no software que lance um erro se a percentagem de humidade for demasiado alta.
A função deve chamar-se checkHumidityLevel e receber a percentagem de humidade como parâmetro.
Deves lançar um erro (a mensagem não é importante) se a percentagem exceder 70%.
checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error
A Elena ficou muito satisfeita com a tua primeira tarefa e pede-te para tratares da monitorização da temperatura das máquinas. Enquanto conversas com um técnico, o Greg, ele diz-te que, se a temperatura de uma máquina exceder 500 °C, os técnicos começam a preocupar-se com o sobreaquecimento.
A máquina está equipada com um sensor que mede a sua temperatura interna. Deves saber que o sensor é muito sensível e avaria com frequência. Nesse caso, os técnicos terão de o substituir.
A tua tarefa é implementar uma função reportOverheating que recebe a temperatura como parâmetro e lança um erro se o sensor estiver avariado ou se a máquina começar a sobreaquecer.
Como vais precisar mais tarde de reagir de forma diferente consoante o erro, precisas de um mecanismo para distinguir os dois tipos de erro.
Podias basear-te nas mensagens de erro, mas isso tornaria o teu código frágil, pois deixaria de funcionar se a mensagem fosse atualizada.
Por isso, para o fazeres corretamente, vais lançar instâncias de classes de erro diferentes.
null.
Nesse caso, deves lançar um ArgumentError.OverheatingError.
Esta classe de erro será instanciada com um argumento de temperatura.
Certifica-te de que o OverheatingError que lanças tem uma propriedade throw associada.reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
Agora que a tua máquina consegue detetar erros, vais implementar uma função que reage a esses erros de formas diferentes:
Implementa uma função monitorTheMachine que recebe um argumento actions.
actions é um objeto que tem 4 propriedades:
| propriedade | descrição |
|---|---|
check |
uma função. Verifica a temperatura da máquina. Pode lançar vários erros. |
alertDeadSensor |
uma função. Avisa um técnico de que o sensor de temperatura está avariado. |
alertOverheating |
uma função. Acende uma luz de aviso na máquina. |
shutdown |
uma função. Desliga a máquina. |
A função monitorTheMachine(actions) deve chamar internamente check().
Se isso correr bem, a função não deve devolver nada.
Se isso lançar um erro, espera-se um comportamento diferente:
| exceção | comportamento esperado |
|---|---|
ArgumentError |
chamar a função alertDeadSensor. |
OverheatingError |
executar o protocolo de sobreaquecimento. |
| (qualquer outra coisa) | voltar a lançar o erro |
Protocolo de sobreaquecimento
Se a temperatura for inferior a 600 °C, acende a luz de aviso chamando a função alertOverheating.
Se a temperatura exceder 600 °C, a situação é crítica, por isso chama a função shutdown.
monitorTheMachine({
check,
alertDeadSensor,
alertOverheating,
shutdown,
});
Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.