Modo corretto di generare errori in una libreria JavaScript?

4

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 poi throw 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
  • 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
  • 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

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?

    
posta Pedro A 30.08.2017 - 04:25
fonte

1 risposta

4

Se non stavi scrivendo una libreria, ti direi che distinguere gli errori è utile solo se hai effettivamente bisogno di differenziare gli errori, il che non è probabile e quindi non dovresti preoccupartene.

Tuttavia vedendo come stai scrivendo una libreria, è sempre meglio sbagliare dalla parte dell'essere troppo formale, quindi sì, dovresti probabilmente lanciare un errore relativo al tipo di errore in questione .

Tra le tre opzioni, direi che l'opzione 3 è probabilmente la soluzione migliore. L'utente può semplicemente prendere il nome dall'errore generato se sono richieste ulteriori informazioni. È possibile aggiungere proprietà che mantengono gli input per le informazioni aggiunte al chiamante.

Anche se posso suggerire un'opzione 4, vale a dire per dare la preferenza all'uso dei tipi di errore esistenti: EvalError, RangeError, ReferenceError, SyntaxError, TypeError e URIError. Avrai solo bisogno di RangeError e probabilmente TypeError con ogni probabilità.

In questo modo la dimensione complessiva della libreria è ridotta (sempre una buona cosa se uno dei punti più alti della libreria è la semplicità) e puoi ancora distinguere gli errori nel codice.

    
risposta data 30.08.2017 - 08:42
fonte