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:
<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à):
function getCost(elem) {
return elem.dataset.price * elem.dataset.amount;
}
Calcoliamo il costo del nostro prodotto:
let 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:
<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:
function 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:
function 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:
let product = document.querySelector('#product');
try {
let cost = getCost(product);
alert(cost);
} catch (error) {
// reagiamo in qualche modo all'eccezione
}
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.