Esempio di eccezione con attributi data- in JavaScript

Supponiamo che al caricamento della pagina, il server crei il codice HTML in cui sono memorizzati il nome, il prezzo e la quantità del prodotto acquistato:

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

Creiamo una funzione che accetti un riferimento all'elemento del prodotto e calcoli il costo totale del prodotto (prezzo moltiplicato per la quantità):

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

Calcoliamo il costo del nostro prodotto:

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

alert(cost);

Supponiamo ora la seguente situazione: a causa di un qualche guasto del server, questo ci ha inviato un prodotto in cui manca il prezzo o la quantità (o entrambi), ad esempio, in questo modo:

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

Se ora si prova a calcolare il costo del prodotto, il risultato visualizzato sarà NaN. Sarete d'accordo, non è molto informativo.

Ciò significa che dobbiamo in qualche modo proteggerci dall'assenza degli attributi di cui abbiamo bisogno. Ci sono due modi per farlo. Il primo modo è considerarlo un comportamento normale e semplicemente verificare con degli if la presenza degli attributi necessari:

javascriptfunction getCost(elem) {
  if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
    return elem.dataset.price * elem.dataset.amount;
  } else {
    return 0; // restituiamo qualcosa, ad esempio 0 o null o false
  }
}

La seconda opzione è considerare l'assenza dell'attributo data-price o data-amount una situazione eccezionale. In questo caso dovremmo lanciare un'eccezione:

javascriptfunction getCost(elem) {
  if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
    return elem.dataset.price * elem.dataset.amount;
  } else {
    throw {
      name: 'ProductCostError',
      message: 'manca il prezzo o la quantità del prodotto'
    };
  }
}

Quale delle due opzioni sia più appropriata applicare qui è una scelta del programmatore. Egli può considerare il problema un normale funzionamento dello script o una situazione eccezionale.

Supponiamo che abbiamo deciso che la situazione è eccezionale. Allora il codice per ottenere il costo del prodotto sarà simile a questo:

javascriptlet product = document.querySelector('#product');

try {
  let cost = getCost(product);
  alert(cost);
} catch (error) {
  // reagiamo in qualche modo all'eccezione
}
Задание 1

Modificate il mio codice in modo che la funzione getCost lanci due tipi di eccezioni: se manca il prezzo e se manca la quantità. Riflettete bene sui nomi di queste eccezioni. Nel blocco catch visualizzate messaggi di errore diversi per eccezioni di tipo diverso.