Catch multiplo

Quando abbiamo introdotto il costrutto try-catch-finally abbiamo detto che esso può avere più blocchi catch che si occupano di gestire eccezioni di tipologia differente.

Se le azioni da eseguire per gestire le diverse tipologie di eccezioni sono differenti, il programmatore è costretto ad utilizzare più blocchi catch, come mostrato nell'esempio di codice che segue:

...
try {

    // sequenza di istruzioni che 
    // potrebbero generare eccezioni

} catch (TipoEccezione1 identificatore) {

    // sequenza di istruzioni da eseguire 
    // per rimediare gli effetti della
    // eccezione del tipo TipoEccezione1
    
    // se la sequenza di istruzioni è diversa
    // dalla sequenza da eseguire per l'eccezione 
    // del tipo TipoEccezione2
    // occorre, per forza di cose, implementare
    // due catch differenti
    
} catch (TipoEccezione2 identificatore) {

    // sequenza di istruzioni da eseguire 
    // per rimediare gli effetti della
    // eccezione del tipo TipoEccezione2

    // se la sequenza di istruzioni è diversa
    // dalla sequenza da eseguire per l'eccezione 
    // del tipo TipoEccezione1
    // occorre, per forza di cose, implementare
    // due catch differenti

} finally {

    // eventuale blocco finally

}
...

Se, invece, la sequenza di azioni da eseguire per gestire le differenti tipologie di eccezioni è la medesima, allora si può optare per un blocco catch multiplo, ossia che gestisce diverse tipologie di eccezione.
Le diverse tipologie di eccezione vanno indicate nell'unico catch, separate dal carattere pipe (|).

Questo comporta un codice ridotto con un evdiente vantaggio in termini di chiarezza e manutenibilità.
Se, infatti, occorre cambiare la modalità di gestione delle diverse tipologie di eccezione, mantenendo lo stesso trattamento, la modifica dovrà essere effettuata in un unico punto del programma, con evidente risparmio di tempo, ma soprattutto riduzione del rischio di commettere errori.
Ricordiamo, infatti, che ogni qualvolta si scrive in punti diversi del programma lo stesso codice, si amplificano le probabilità di commettere errori e di introdurre bugs.

Un esempio di catch multiplo, in Java, è mostrato nel frammento di codice che segue:

...
try {

    // sequenza di istruzioni che 
    // potrebbero generare eccezioni

} catch (TipoEccezione1|TippoEccezione2 identificatore) {

    // notare, tra le parentesi del catch, 
    // le diverse tipologie di eccezione
    // separate dal carattere pipe

    // sequenza di istruzioni da eseguire 
    // per rimediare gli effetti della
    // eccezione del tipo TipoEccezione1
    // oppure del tipo TipoEccezione2
    
    // notare che la sequenza di istruzioni 
    // deve essere la medesima, ossia le 
    // diverse tipologie di anomalie 
    // richiedono di essere trattate 
    // allo stesso modo
    
} finally {

    // eventuale blocco finally

}
...