Los errores son útiles para avisar cuando algo está 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 de padre e hijo entre clases. La clase hija (a la que a veces se llama subclase) tiene acceso al comportamiento y a los datos que define la clase padre (a la que a veces se llama 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 que crea 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 que defina 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 comprueba 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 gerente 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 podría mejorar. Descubrió que los técnicos hacen muchos controles de calidad a mano. Ve que hay una buena oportunidad para la automatización y te pide a ti, desarrollador independiente, que desarrolles un programa para monitorear algunas de las máquinas.
Tu primera misión es escribir un programa que monitoree 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.
Necesitas 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 monitorear la temperatura de las máquinas. Mientras conversas con un técnico, Greg, te comentan 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 se rompe a menudo. En ese caso, los técnicos tendrán que cambiarlo.
Tu tarea es 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 vas a necesitar reaccionar de forma distinta según el error, necesitas un mecanismo que diferencie los dos tipos de errores.
Podrías apoyarte en los mensajes de error, pero eso haría tu código frágil, ya que se rompería si el mensaje se actualiza.
Así que, para poder hacerlo bien, 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 de temperatura.reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
Ahora que tu máquina puede detectar errores, vas a implementar una función que reaccione a esos errores de distintas maneras:
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 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 lanza un error (con throw), 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) | relanza el error |
Protocolo de sobrecalentamiento
Si la temperatura es menor que 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.