Diciamo che sto scrivendo una semplice libreria in JavaScript, con solo alcune funzioni:
- Calcola il fattoriale di un numero naturale positivo
- Trova il minimo comune multiplo da un array di numeri interi
- E così via ...
In ciascuna di queste funzioni, verificherò se il parametro dato è accettabile prima di eseguire qualsiasi operazione e vorrei sollevare un errore se non lo è. (Aumentare gli errori è una buona pratica di programmazione, giusto?)
Per fare questo, posso pensare ad alcune opzioni differenti. Prendi la funzione factorial(x)
, ad esempio:
-
Opzione 1: semplicemente
throw new Error("Invalid argument for factorial(): natural number expected.")
-
Opzione 2: definisci
class NotANaturalNumberError extends Error {}
nel ambito globale (!) e poithrow new NotANaturalNumberError("Invalid argument for factorial(): natural number expected.")
-
Opzione 3: quasi uguale all'opzione 2 ma senza ingombrare l'ambito globale e invece definire
class NotANaturalNumberError extends Error {}
in un ambito locale (come all'interno di una chiusura)
Tutti hanno pro e contro, però:
-
Opzione 1:
- Contro: sarebbe necessario un codice complicato per distinguerlo da altri possibili errori, poiché è solo un
Error
, la superclasse. - Pro: una semplice riga di codice, non ingombra l'ambito globale
- Contro: sarebbe necessario un codice complicato per distinguerlo da altri possibili errori, poiché è solo un
-
Opzione 2:
- Contro: oscura l'ambito globale, che è generalmente considerato terribile e potrebbe entrare in conflitto con qualcos'altro. Inoltre, l'utente deve in qualche modo essere informato che si chiama
NotANaturalNumberError
. - Pro: l'utente della libreria può eseguire il controllo
e instanceof NotANaturalNumberError
quando rileva un errore
- Contro: oscura l'ambito globale, che è generalmente considerato terribile e potrebbe entrare in conflitto con qualcos'altro. Inoltre, l'utente deve in qualche modo essere informato che si chiama
-
Opzione 3:
- Contro: l'utente della libreria non può eseguire il controllo
e instanceof NotANaturalNumberError
quando rileva un errore poichéNotANaturalNumberError
non è definito esternamente. - Pro: non ingombra l'ambito globale
- Contro: l'utente della libreria non può eseguire il controllo
Nessuna di queste opzioni sembra abbastanza buona e non riesco a pensare a nessun'altra. Qual è il modo corretto per farlo? Come fanno le grandi librerie là fuori?