X x;
try
{
x = exampleObject.DoSomething ();
}
catch (ThisCanGoWrongException ex)
Se DoSomething restituisce qualcosa, non può nel frattempo restituire un errore, eccetto che c'è spazio nello Spazio risultato. Un'istanza ben nota di questo fenomeno è una libreria C, che legge un byte e restituisce un int. Mentre i byte sono considerati senza segno, il caso di errore è / era un -1.
Ma ora devi fare un brutto cast da fare.
Che cosa fai, se lo spazio dei risultati non ti dà spazio per i risultati, che significa "non valido"? Bene, puoi usare un Wrapper, che restituisce, invece di un T uno o [Errore, T]. Il risultato giusto di solito significa un risultato che va bene, e sinistra è lasciato a significare un tipo di errore.
Invece dell'errore come tipo speciale di valore, l'utente della tua biblioteca è - in lingue tipizzate staticamente - informato in anticipo, che c'è qualcosa che potrebbe andare storto.
Al contrario, per
String ips = getIP ("programmers.se.com");
// returns "err.or.in.DNS" in errorcase - but programmer
// forgot to check
for (String b : ips.split (".")) {
Integer.parseInt (b); // crash here
A volte, i metodi vengono richiamati per il loro effetto collaterale e il valore di ritorno non viene affatto controllato. Quindi un errore può passare inosservato.
user.setAge (-42);
Forse la classe restituisce un "falso" o un messaggio "Età non valida, deve essere > = 0". Ma molte lingue permettono di ignorare il risultato restituito. Un'eccezione sarebbe preferibile qui.
Un problema con le eccezioni e il risultato avvolto è che a volte ingombrano il codice e rendono più difficile seguire il caso sano. Forse vedremo miglioramenti in futuro - Java sta cercando ad esempio di semplificare la gestione delle eccezioni di recente. Gli IDE potrebbero probabilmente nascondere o piegare il codice di eccezione su richiesta.
In alcuni casi, potrebbe essere ragionevole restituire un oggetto Null speciale. Pensa a cercare un utente speciale nel database. Se qualcosa va storto, puoi restituire null.
println (null.getName ()); // crash: NPE
Una soluzione spesso vista è quella di restituire una lista con un elemento nel caso normale e valori zero nel caso del difetto.
users = db.get ("Zappa");
for (User u : users) {
u.doSomething ();
Funzionerà con uno o nessun elemento e Lingue come Haskell o Scala hanno una classe di scopo speciale per questo, un Forse o un'opzione.
L'opzione è una classe parametrizzata. Un'opzione [T] può essere Some (T) o None. L'utente deve comunque controllare il risultato, ma non può dimenticarlo facilmente.
Questo è simile al risultato di una lista vuota, e potrebbe non essere appropriato ovunque, ma spesso lo è.