Non chiamerei null
e ho controllato i concetti doppi delle eccezioni; in effetti, sono la stessa cosa in incognito (più su questo più tardi). L'errore di segnalazione in un valore di ritorno e le eccezioni non selezionate sono concetti duali. Il ritorno di null
è one way per segnalare un errore nel valore di ritorno, ma sovverte il sistema di tipi della lingua. Ti sei già accorto di questo fatto: non puoi mai avere il tipo di solo stringhe, devi vivere con il tipo di stringhe e% di% equazione.
L'approccio corretto all'uso del valore restituito è quello di eliminare null
e utilizzare un tipo separato (solitamente chiamato null
o Option
) che rappresenta il concetto di "un valore di tipo Maybe
, o %codice%". Un T
non è un Nothing
- non puoi assegnarne uno all'altro e devi ispezionare esplicitamente Option X
e gestire entrambi i casi. Non puoi semplicemente dimenticare che la funzione potrebbe non riuscire a restituire un valore.
X
funziona bene quando i guasti sono comuni e possono essere gestiti immediatamente. Non funziona così bene quando i guasti sono rari e il chiamante immediato non può fare nulla di significativo a riguardo. Quando il fallimento può essere gestito solo più in alto nello stack, devi restituire Option
fino in fondo - se ottieni un valore, procedi, e se non lo fai, restituisci Maybe
, più e più volte finché non ottieni al punto in cui è effettivamente possibile gestire l'errore. Immagina se la divisione non lanciasse un'eccezione e invece restituisse Maybe
- che dolore!
Non solo è maldestro, obbliga tutto il gestore e l'errore a conoscere la possibilità di un errore e modifica il suo tipo di ritorno a Nothing
. Questo ostacola il modo in cui si scrivono funzioni che assumono altre funzioni come argomenti. A volte vuoi passare una funzione che potrebbe teoricamente fallire, ma hai assicurato che non sarà così, o se non lo faresti, non potrai farci nulla. Le eccezioni non controllate vengono qui in soccorso, perché eseguono automaticamente l'inoltro dell'errore e qualsiasi cosa nel mezzo può ignorare beatamente la possibilità di un errore. Se la tua unica opzione fosse Maybe Double
e controllasse le eccezioni, saresti sfortunato, perché la possibilità di errore è codificata nel tipo di reso della funzione e ciò lo rende incompatibile con il tipo di funzione che ti aspetti.
Il problema con le eccezioni controllate è che non sono adatti per nessuno dei due scopi. Quando l'errore deve essere gestito ulteriormente, si forza tutto il codice tra il gestore e l'errore per riflettere la possibilità di errore nella sua firma. Quando l'errore può essere gestito immediatamente, ottieni tutti i benefici di Maybe
- non puoi dimenticarti di gestirlo - ma è più semplice da usare rispetto a un semplice if / switch! Quindi è un po 'goffo Maybe
nei vestiti delle eccezioni.