Propagación de excepciones en JavaScript
Consideremos el bloque catch de la tarea con el JSON del producto:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON del producto incorrecto');
} else if (error.name == 'ProductCostError') {
alert('Al producto le falta el precio o la cantidad');
}
}
Como puedes ver, capturamos dos excepciones
planificadas por nosotros y reaccionamos de alguna manera.
Pero, ¿qué pasará si ocurre una excepción no prevista
por nosotros de otro tipo? En ese caso
también caerá en el bloque catch, pero
no habrá ninguna reacción a esto, ya
que una excepción de otro tipo simplemente no caerá
en ninguno de nuestros condicionales if.
Cuando digo que no habrá ninguna reacción, me refiero a que realmente ninguna: ni siquiera se mostrará el error en la consola. Nuestro código simplemente no funcionará en silencio.
Por lo tanto, existe la siguiente regla: tu
código debe capturar solo aquellas excepciones con
las que sepa cómo manejarlas. Si la excepción
no es conocida, entonces debe propagarse
más lejos usando throw. En este caso,
alguien más informado la capturará arriba
o la excepción se mostrará como un error en la consola.
Corrijamos nuestro código:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON del producto incorrecto');
} else if (error.name == 'ProductCostError') {
alert('Al producto le falta el precio o la cantidad');
} else {
throw error; // propagamos la excepción más allá
}
}
Se da el siguiente código:
try {
let arr = JSON.parse(json);
for (let i = 0; i < arr.length; i++) {
localStorage.setItem(i, arr[i]);
}
} catch (error) {
if (error.name == 'QuotaExceededError') {
alert('se agotó el espacio en el almacenamiento');
}
if (error.name == 'SyntaxError') {
alert('JSON incorrecto');
}
}
¿Qué está mal con este código? Corrígelo a uno más adecuado.