JavaScript - Estendere gli Errori
Ciao, futuri maghi di JavaScript! Oggi esploreremo il mondo emozionante dell'estensione degli errori in JavaScript. Non preoccuparti se sei nuovo alla programmazione - sarò la tua guida amichevole in questa avventura. Alla fine di questa lezione, sarai in grado di creare i tuoi errori personalizzati come un professionista!
Estendere la Classe Error: Creare Errori Personalizzati
Iniziamo con le basi. In JavaScript, abbiamo una classe built-in Error
che possiamo utilizzare per creare oggetti di errore. Ma a volte, abbiamo bisogno di errori più specifici per le nostre applicazioni. Ecco dove estendere la classe Error
diventa utile!
Perché Estendere gli Errori?
Immagina di essere in procinto di costruire un'app per la cucina, e vuoi creare errori specifici per i pasticci in cucina. Potresti utilizzare l'Error
generico, ma non sarebbe più bello avere un BurnedFoodError
o un OverseasonedError
? Questo è ciò che impareremo a fare!
Sintassi di Base per Estendere gli Errori
Iniziamo con un esempio semplice:
class KitchenError extends Error {
constructor(message) {
super(message);
this.name = 'KitchenError';
}
}
Analizziamo questo codice:
- Utilizziamo la parola chiave
class
per definire la nostra nuova classe di errore. -
extends Error
dice a JavaScript che la nostra nuova classe dovrebbe ereditare dalla classeError
built-in. - Nel
constructor
, chiamiamosuper(message)
per assicurarci che la classe genitoreError
venga inizializzata correttamente. - Impostiamo
this.name
per dare al nostro errore un nome specifico.
Ora, vediamo come possiamo utilizzare questo:
try {
throw new KitchenError("La pasta è attaccata al soffitto!");
} catch (error) {
console.log(error.name); // Output: KitchenError
console.log(error.message); // Output: La pasta è attaccata al soffitto!
}
Aggiungere Proprietà Personalizzate
Una delle cose più interessanti dell'estendere gli errori è che possiamo aggiungere le nostre proprietà personalizzate. Miglioriamo il nostro KitchenError
:
class KitchenError extends Error {
constructor(message, dish) {
super(message);
this.name = 'KitchenError';
this.dish = dish;
}
}
try {
throw new KitchenError("Sta bruciando!", "lasagna");
} catch (error) {
console.log(`Oh no! La ${error.dish} è in difficoltà: ${error.message}`);
// Output: Oh no! La lasagna è in difficoltà: Sta bruciando!
}
In questo esempio, abbiamo aggiunto una proprietà dish
al nostro errore. Questo ci permette di fornire un contesto più specifico su cosa è andato storto nella nostra disavventura in cucina!
Creare Tipi di Errore Specifici
Ora che sappiamo come estendere la classe Error
, creiamo alcuni tipi di errore specifici per la nostra app di cucina:
class BurnedFoodError extends KitchenError {
constructor(dish) {
super(`Il ${dish} è bruciato a carbone!`, dish);
this.name = 'BurnedFoodError';
}
}
class OverseasonedError extends KitchenError {
constructor(dish, seasoning) {
super(`Il ${dish} è eccessivamente condito con ${seasoning}!`, dish);
this.name = 'OverseasonedError';
this.seasoning = seasoning;
}
}
Ora possiamo utilizzare questi tipi di errore specifici nel nostro codice:
function cookDinner(dish, seasoning) {
if (Math.random() < 0.5) {
throw new BurnedFoodError(dish);
} else if (Math.random() < 0.5) {
throw new OverseasonedError(dish, seasoning);
}
console.log(`Il tuo ${dish} è cotto alla perfezione!`);
}
try {
cookDinner("bistecca", "sale");
} catch (error) {
if (error instanceof BurnedFoodError) {
console.log(`Ops! ${error.message} È il momento di ordinare il takeout.`);
} else if (error instanceof OverseasonedError) {
console.log(`Ouch! ${error.message} Forse usare meno ${error.seasoning} la prossima volta.`);
} else {
console.log("Qualcosa è andato storto in cucina!");
}
}
Questo codice simula la natura imprevedibile della cucina (perlomeno per alcuni di noi!) e mostra come possiamo gestire diversi tipi di errori in modi diversi.
Eredità Multilivello
Ora, portiamo la nostra gerarchia di errori al livello successivo - letteralmente! Possiamo creare una catena di tipi di errore, ciascuno ereditante dal precedente. Questo è chiamato eredità multilivello.
Espandiamo il nostro sistema di errori in cucina:
class KitchenApplianceError extends KitchenError {
constructor(message, appliance) {
super(message);
this.name = 'KitchenApplianceError';
this.appliance = appliance;
}
}
class OvenError extends KitchenApplianceError {
constructor(message) {
super(message, 'forno');
this.name = 'OvenError';
}
}
class MicrowaveError extends KitchenApplianceError {
constructor(message) {
super(message, 'microonde');
this.name = 'MicrowaveError';
}
}
In questo esempio:
-
KitchenApplianceError
estendeKitchenError
-
OvenError
eMicrowaveError
entrambi estendonoKitchenApplianceError
Vediamo come possiamo utilizzare questa gerarchia:
function useAppliance(appliance) {
if (appliance === 'forno') {
throw new OvenError("Il forno non si scalda!");
} else if (appliance === 'microonde') {
throw new MicrowaveError("Il microonde fa rumori strani!");
}
}
try {
useAppliance('forno');
} catch (error) {
if (error instanceof OvenError) {
console.log(`Problema con il forno: ${error.message}`);
} else if (error instanceof MicrowaveError) {
console.log(`Problema con il microonde: ${error.message}`);
} else if (error instanceof KitchenApplianceError) {
console.log(`Errore generale dell'apparecchio in cucina con il ${error.appliance}: ${error.message}`);
} else if (error instanceof KitchenError) {
console.log(`Errore in cucina: ${error.message}`);
} else {
console.log(`Errore inaspettato: ${error.message}`);
}
}
Questa eredità multilivello ci permette di creare tipi di errore molto specifici mantenendo una gerarchia logica. Possiamo catturare errori a diversi livelli di specificità, dal più specifico (OvenError
) al più generico (Error
).
Tabella dei Metodi
Ecco una tabella che riassume i metodi e le proprietà chiave che abbiamo utilizzato nei nostri errori personalizzati:
Metodo/Proprietà | Descrizione | Esempio |
---|---|---|
constructor() |
Inizializza l'oggetto di errore | constructor(message, dish) |
super() |
Chiama il costruttore della classe genitore | super(message) |
this.name |
Imposta il nome dell'errore | this.name = 'KitchenError' |
this.[custom] |
Aggiunge una proprietà personalizzata | this.dish = dish |
instanceof |
Controlla se un oggetto è un'istanza di una classe | if (error instanceof OvenError) |
Ricorda, estendere gli errori non è solo questione di creare nomi fantasiosi per i tuoi errori - è creare un modo strutturato per gestire diversi tipi di errori nel tuo codice. Questo può rendere il debug più facile e i tuoi messaggi di errore più informativi e specifici.
Quindi, la prossima volta che stai programmando e qualcosa va storto, non limitarti a lanciare un errore generico - crea uno personalizzato! Chi lo sa, forse il tuo CodeSpaghettiError
diventerà il parlare del tuo team di sviluppo. Buon coding, e che tutti i tuoi errori siano perfettamente estesi!
Credits: Image by storyset