⊗jsSpExcDAE 148 of 294 menu

Ejemplo de excepción con atributos data- en JavaScript

Supongamos que al cargar la página, el servidor crea un código HTML que almacena el nombre, el precio y la cantidad del producto comprado:

<div id="product" data-product="manzana" data-price="1000" data-amount="5"></div>

Hagamos una función que tome una referencia al elemento del producto y encuentre el costo total del artículo (precio multiplicado por la cantidad):

function getCost(elem) { return elem.dataset.price * elem.dataset.amount; }

Encontremos el costo de nuestro producto:

let product = document.querySelector('#product'); let cost = getCost(product); alert(cost);

Ahora supongamos la siguiente situación: debido a algún fallo en el servidor, este nos envió un producto al que le falta el precio o la cantidad (o ambos a la vez), por ejemplo, así:

<div id="product" data-product="manzana" data-price="1000"></div>

Si ahora intentamos calcular el costo del producto, el resultado mostrado en pantalla será NaN. Estarás de acuerdo, no es muy informativo.

Resulta que necesitamos protegernos de alguna manera contra la ausencia de los atributos que necesitamos. Esto se puede hacer de dos maneras. La primera forma es asumir que es un comportamiento normal y simplemente verificar con ifs la presencia de los atributos necesarios:

function getCost(elem) { if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) { return elem.dataset.price * elem.dataset.amount; } else { return 0; // devolvemos algo, por ejemplo, 0 o null o false } }

La segunda opción es asumir que la ausencia del atributo data-price o data-amount es una situación excepcional. En este caso lanzaremos una excepción:

function getCost(elem) { if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) { return elem.dataset.price * elem.dataset.amount; } else { throw { name: 'ProductCostError', message: 'falta el precio o la cantidad del producto' }; } }

Cuál de las dos opciones es más apropiada aplicar aquí - es una decisión del programador. Puede considerar el problema como parte del funcionamiento normal del script o como una situación excepcional.

Supongamos que decidimos que la situación es excepcional. Entonces el código para obtener el costo del producto se verá así:

let product = document.querySelector('#product'); try { let cost = getCost(product); alert(cost); } catch (error) { // reaccionamos de alguna manera a la excepción }

Modifique mi código para que la función getCost lance dos tipos de excepciones: si falta el precio y si falta la cantidad. Piense bien sobre los nombres de estas excepciones. En el bloque catch, muestre diferentes mensajes de error para excepciones de diferentes tipos.

msuzlkanluz