Los errores son útiles para informar cuando algo va mal o es inesperado en un programa o en un fragmento de código.
Son objetos de JavaScript.
La propiedad principal de este objeto es message:
const error = new Error('Oops, something went wrong');
console.log(error.message);
// => "Oops, something went wrong"
Con la sintaxis throw, puedes lanzar un Error.
throw new Error('Oops');
Cuando se lanza un error, la ejecución actual se detiene y se reanuda en el primer bloque catch de la pila de llamadas.
try {
throw new Error('Oops');
} catch (error) {
console.log(error.message);
// => "Oops"
}
La herencia es una forma de crear relaciones padre-hijo entre clases. La clase hija (a veces denominada subclase) tiene acceso al comportamiento y a los datos definidos por la clase padre (a veces denominada superclase).
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.
La palabra clave extends en la declaración de la clase hija establece una relación con la clase padre a través de la cadena de prototipos.
Los objetos creados por el constructor de la clase hija tendrán el prototipo de la clase padre en su cadena de prototipos, lo que da acceso a cualquier método o dato definido por la clase padre.
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
Como con cualquier clase en JavaScript, las subclases pueden heredar de Error para crear errores personalizados usando la palabra clave extends.
La sintaxis instanceof comprobará si el error capturado es una instancia de una subclase concreta 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');
}
}
Elena es la nueva responsable de calidad de una fábrica de periódicos. Como acaba de llegar a la empresa, ha decidido revisar algunos de los procesos de la fábrica para ver qué se puede mejorar. Ha descubierto que los técnicos hacen un montón de controles de calidad a mano. Ve una buena oportunidad para la automatización y te pide a ti, desarrollador freelance, que desarrolles un programa para monitorizar algunas de las máquinas.
Tu primera misión es escribir un programa para monitorizar el nivel de humedad de la sala de producción. Ya hay un sensor conectado al software de la empresa que devuelve periódicamente el porcentaje de humedad de la sala.
Debes implementar una función en el software que lance un error si el porcentaje de humedad es demasiado alto.
La función debe llamarse checkHumidityLevel y recibir el porcentaje de humedad como parámetro.
Debes lanzar un error (el mensaje no es importante) si el porcentaje supera el 70 %.
checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error
Elena está muy contenta con tu primera tarea y te pide que te encargues de monitorizar la temperatura de las máquinas. Mientras charlas con un técnico, Greg, este te cuenta que, si la temperatura de una máquina supera los 500 °C, los técnicos empiezan a preocuparse por el sobrecalentamiento.
La máquina está equipada con un sensor que mide su temperatura interna. Debes saber que el sensor es muy sensible y a menudo se rompe. En ese caso, los técnicos tendrán que cambiarlo.
Tu trabajo consiste en implementar una función reportOverheating que reciba la temperatura como parámetro y lance un error si el sensor está roto o si la máquina empieza a sobrecalentarse.
Como más adelante tendrás que reaccionar de forma distinta según el error, necesitas un mecanismo para diferenciar los dos tipos de errores.
Podrías basarte en los mensajes de error, pero eso haría tu código frágil, ya que se rompería si se actualiza el mensaje.
Así que, para poder hacerlo correctamente, lanzarás instancias de distintas clases de error.
null.
En ese caso, debes lanzar un ArgumentError.OverheatingError.
Esta clase de error se instanciará con un argumento de temperatura.
Asegúrate de que el OverheatingError que lances tenga una propiedad temperature adjunta.reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
Ahora que tu máquina puede detectar errores, implementarás una función que reaccione a esos errores de distintas formas:
Implementa una función monitorTheMachine que reciba un argumento actions.
actions es un objeto que tiene 4 propiedades:
| propiedad | descripción |
|---|---|
check |
una función. Comprueba la temperatura de la máquina. Puede lanzar varios errores. |
alertDeadSensor |
una función. Avisa a un técnico de que el sensor de temperatura está averiado. |
alertOverheating |
una función. Encenderá una luz de advertencia en la máquina. |
shutdown |
una función. Apagará la máquina. |
La función monitorTheMachine(actions) debe llamar internamente a check().
Si eso no lanza ningún error, la función no debe devolver nada.
Si eso, al hacer throw, lanza un error, se espera un comportamiento distinto:
| excepción | comportamiento esperado |
|---|---|
ArgumentError |
llama a la función alertDeadSensor. |
OverheatingError |
ejecuta el protocolo de sobrecalentamiento. |
| (cualquier otra cosa) | vuelve a lanzar el error |
Protocolo de sobrecalentamiento
Si la temperatura es inferior a 600 °C, enciende la luz de advertencia llamando a la función alertOverheating.
Si la temperatura supera los 600 °C, la situación es crítica, así que llama a la función shutdown.
monitorTheMachine({
check,
alertDeadSensor,
alertOverheating,
shutdown,
});
Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.