Eccezioni e gestione degli errori in TypeScript: Come utilizzare try-catch e creare eccezioni personalizzate

In TypeScript è possibile creare eccezioni personalizzate estendendo la classe Error. Ad esempio, creare un'eccezione personalizzata per una divisione per zero. Ciò rende il codice più chiaro e semplice da gestire, poiché gli sviluppatori possono gestire situazioni specifiche in modo più preciso.

Eccezioni e gestione degli errori in TypeScript: Come utilizzare try-catch e creare eccezioni personalizzate

In TypeScript, la gestione delle eccezioni e degli errori è simile a quella in altri linguaggi di programmazione come Java e C#.

Per gestire le eccezioni, si utilizza la struttura try-catch. Il blocco try contiene il codice che potrebbe generare un'eccezione, mentre il blocco catch gestisce l'eccezione. Ad esempio:

try {
    // codice che potrebbe generare un'eccezione
} catch (e) {
    // codice per gestire l'eccezione
}

Inoltre, è possibile utilizzare il blocco finally per eseguire codice indipendentemente dal fatto che sia stata generata un'eccezione o meno.

try {
    // codice che potrebbe generare un'eccezione
} catch (e) {
    // codice per gestire l'eccezione
} finally {
    // codice che viene sempre eseguito
}

In TypeScript, è anche possibile creare e lanciare eccezioni personalizzate utilizzando la classe Error. Ad esempio:

class MyError extends Error {
    constructor(message: string) {
        super(message);
        this.name = "MyError";
    }
}

throw new MyError("Errore personalizzato");

In questo modo, è possibile gestire gli errori in modo più preciso e fornire un feedback più significativo agli utenti del nostro codice.

Ad esempio, immaginiamo di avere una funzione che effettua una divisione tra due numeri, ma che solleva un'eccezione personalizzata chiamata DivisionByZeroError se il denominatore è zero. Possiamo creare questa eccezione estendendo la classe Error come segue:

class DivisionByZeroError extends Error {
    constructor(message: string) {
        super(message);
        this.name = "DivisionByZeroError";
    }
}

Successivamente, possiamo utilizzare questa eccezione all'interno della funzione di divisione come segue:

function divide(numerator: number, denominator: number): number {
    if (denominator === 0) {
        throw new DivisionByZeroError("Denominator cannot be zero");
    }
    return numerator / denominator;
}

In questo modo, se la funzione divide viene chiamata con un denominatore di zero, verrà sollevata un'eccezione DivisionByZeroError con il messaggio specificato. Inoltre, poiché questa eccezione estende la classe Error, è possibile gestirla come qualsiasi altra eccezione predefinita in TypeScript.

Per gestire l'eccezione personalizzata DivisionByZeroError sollevata dalla funzione divide, si può utilizzare un blocco try-catch come segue:

try {
    let result = divide(5, 0);
    console.log(result);
} catch (e: DivisionByZeroError) {
    console.log("Error: " + e.message);
}

In questo esempio, si specifica il tipo di eccezione nel blocco catch (catch (e: DivisionByZeroError)) in modo che TypeScript sappia che si vuole gestire solo l'eccezione DivisionByZeroError e non altre eccezioni. In questo modo si può evitare la verifica del tipo di eccezione con un'istruzione if e si può accedere direttamente alla proprietà message dell'eccezione senza dover utilizzare una variabile di tipo Error.

In sintesi, la gestione delle eccezioni e degli errori in TypeScript è simile a quella in altri linguaggi di programmazione come Java e C#, utilizzando la struttura try-catch e la possibilità di creare eccezioni personalizzate.

Lavorare con classi e interfacce in TypeScript
Scopri come utilizzare l’ereditarietà in TypeScript per creare classi più organizzate e facili da manutenere. Impara a utilizzare la parola chiave “extends” per creare una classe che estende le caratteristiche di un’altra classe, ereditando le sue proprietà e metodi.
Lezione precedente