Ho letto e sperimentato la versione di prova di Scala 2.9 ... cattura, e mi ha fatto pensare alle possibilità. Cosa dovrei effettivamente usare per non salvare un paio di righe di codice?Quali sono i casi d'uso per il tentativo di Scala 2.9 ... prendere la generalizzazione?
risposta
Il caso d'uso è quello di essere in grado di avere la gestione generica in tutta l'applicazione di errore. Supponiamo che tu voglia gestire tutti gli FileNotFoundException
s nell'applicazione inviando un'e-mail a un amministratore. In precedenza, dovreste fare in questo modo:
// Globally
val fileNotFound: PartialFunction[Throwable, Unit] = {
case e: FileNotFoundException =>
// Create report and send the e-mail
}
// On each try-catch-block
try {
// Open file
}
catch {
case fnf: FileNotFoundException => fileNotFound(fnf)
}
Ora basta fare:
try {
// Open file
} catch fileNotFound
Questo ha anche il bel vantaggio che è possibile collegare diversi gestori di tale eccezione con il metodo orElse
su funzioni parziali:
val fileErrors = fileNotFound orElse endOfFile orElse invalidFormat
E quindi basta utilizzarlo ovunque, dove è necessario il trattamento delle eccezioni del file. Tale gestore di errori può essere combinato dinamicamente in base al file di configurazione dell'applicazione, ad esempio. Questo è molto meno ingombrante del modello che corrisponde ovunque e chiama il gestore corretto.
Una cosa utile che può essere sfruttata sopra funzioni parziali è l'operatore andAlso
, che funge da operatore di sequenziamento su due funzioni parziali. Ciò sarebbe utile quando si desidera eseguire una gestione degli errori specifica per un blocco try-catch specifico dopo aver eseguito la gestione degli errori generici.
implicit def pf2ops(pf: PartialFunction[Throwable, Unit]) = new {
def andAlso(localpf: PartialFunction[Throwable, Unit]) = new PartialFunction[Throwable, Unit] {
def apply(t: Throwable) = {
if (pf.isDefinedAt(t)) pf(t)
localpf(t)
}
def isDefinedAt(t: Throwable) = pf.isDefinedAt(t) || localpf.isDefinedAt(t)
}
}
E poi si può fare questo:
scala> try {
| throw new java.io.FileNotFoundException
| } catch fnf andAlso {
| case e: Exception => println("I don't know, but something is specific to this particular block.")
| }
I don't know, but something is specific to this particular block.
Credo che si potrebbe giocare ulteriormente con la semantica esatte e il significato (e il nome) di andAlso
.
Bella risposta - Penso che la parte di andAlso era il bit che mi mancava. – Seth
Buona risposta per axel22, ma penso che la vera ragione della sua introduzione sia un'altra cosa. La manipolazione try
/ha introdotto un caso speciale . Hai usato una funzione parziale letterale, ma non puoi realmente sostituirla con una funzione parziale. Ora, catch
riceve solo una funzione parziale e un altro caso speciale nella lingua non esiste più.
- 1. Quali sono i diversi tipi di casi?
- 2. Quali sono i casi d'uso per i Web Worker?
- 3. Quali sono i casi d'uso per __new__ di Python?
- 4. settings.maxPrintString per Scala 2.9 REPL
- 5. Quali sono i casi d'uso corretti per process.nextTick in Node.js?
- 6. quali sono i casi d'uso per std :: unique_lock :: release?
- 7. Quali sono i possibili casi di utilizzo di AOP?
- 8. Quali sono i casi di utilizzo reale del curry?
- 9. Scala 2.9 Ponte-Metodo
- 10. Quali sono le garanzie per i qualificatori di accesso scala?
- 11. Quali nuove funzionalità verranno aggiunte a Scala 2.9?
- 12. Quali sono alcuni casi d'uso per le strutture di tupla?
- 13. Quali sono i casi di utilizzo per i rami orfani git?
- 14. Quali casi d'uso per OWL?
- 15. Quali sono i migliori IDE di Scala all'inizio del 2010?
- 16. Quali sono i vantaggi dell'uso di Scala in .Net?
- 17. Quali sono i plugin del compilatore di scala?
- 18. Generalizzazione "sequenza" per tutti i funtori?
- 19. Quali sono i casi d'uso previsti per il contesto della funzione di risoluzione e i parametri rootValue?
- 20. Quali funzionalità di Scala sono implementate internamente utilizzando la riflessione?
- 21. Quali sono le eccezioni standard di Scala?
- 22. Quali librerie iteratee/pipe ben sviluppate sono disponibili per Scala?
- 23. Quali sono le migliori caratteristiche di Scala?
- 24. Quali sono i parametri per la funzione punteggio di sklearn?
- 25. I casi d'uso per @WebInitParam
- 26. Converti Opzione per entrambi i casi a Scala
- 27. Quali sono i casi di utilizzo tipici di LXC rispetto a VM?
- 28. Quali sono i casi d'uso per gli spazi dei nomi git?
- 29. Problemi di generalizzazione delle classi di tipo Scala
- 30. Quali sono i casi di utilizzo validi di goto in PHP?
Non sono sicuro che lo userei .... ma puoi usare * qualsiasi * (conforme) PartialFunction ... avere un errore unificato per la gestione altrove? (Dite "ignoreTheseSillyClosableExceptions".) Inoltre, "è proprio bello" che Scala possa esprimerlo così ;-) –
Per ispirazione: Paul Phillips ha fornito un esempio motivazionale quando ha implementato questo: http://www.scala-lang.org/node/8070 –
La domanda sarebbe meglio con un esempio o almeno un collegamento. – ziggystar