He leído y experimentado con la función Scala 2.9 try ... catch, y me hace pensar en las posibilidades. ¿Para qué lo usaría para otro que no sea guardar un par de líneas de código?¿Cuáles son los casos de uso para probar Scala 2.9 ... generalización de capturas?
Respuesta
El caso de uso es ser capaz de tener el manejo de toda la aplicación de error genérico. Supongamos que desea manejar todos los FileNotFoundException
s en su aplicación enviando un correo electrónico a un administrador. Anteriormente, habría que hacerlo de esta manera:
// 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)
}
Ahora que acaba de hacer:
try {
// Open file
} catch fileNotFound
Esto también tiene la ventaja agradable que se puede enlazar varios controladores de tales excepciones usando el método de orElse
funciones parciales:
val fileErrors = fileNotFound orElse endOfFile orElse invalidFormat
Y luego simplemente use eso en todos los lugares donde necesite manejo de excepciones de archivos. Tal controlador de errores se puede combinar dinámicamente en función del archivo de configuración para la aplicación, por ejemplo. Esto es mucho menos engorroso que la coincidencia de patrones en todas partes y llama al manejador correcto.
Una cosa útil que podría ser pimped en la parte superior de funciones parciales es el operador andAlso
, que actúa como un operador de secuencia en dos funciones parciales. Esto sería útil cuando desee realizar un manejo de errores específico de un bloque de prueba en particular después de haber realizado el manejo genérico de errores.
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)
}
}
Y entonces usted puede hacer esto:
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.
Creo que se puede jugar más allá con la semántica exacta y el significado (y el nombre) de andAlso
.
Una respuesta agradable - Creo que el y también la parte era la parte que me faltaba. – Seth
Buena respuesta por axel22, pero creo que el verdadero motivo de su introducción es otra cosa. El manejo try
/catch
/finally
presentó un caso especial . Usó un literal de función parcial, pero en realidad no podría reemplazarlo con una función parcial. Ahora, catch
acaba de recibir una función parcial, y un caso especial más en el idioma se ha ido.
Me gusta esta respuesta también :) – Seth
Esto realmente confirma mi razonamiento inicial, que esta es principalmente una característica de "limpieza". – Seth
De acuerdo, es el principio de uniformidad en su mejor expresión, una construcción generalizada que tiene usabilidad como consecuencia. – axel22
- 1. ¿Cuáles son los casos de uso para __new__ de Python?
- 2. ¿Cuáles son los posibles casos de uso de AOP?
- 3. ¿Cuáles son los casos de uso de jsdom
- 4. ¿Cuáles son los casos de uso de Node.js vs Twisted?
- 5. ¿Cuáles son algunos ejemplos de casos de uso para literales de símbolos en Scala?
- 6. Casos de uso para flujos en Scala
- 7. ¿Cuáles son los mejores casos de uso para usar Clojure para un nuevo desarrollo?
- 8. ¿Cuáles son los casos de uso adecuados para el tipo de datos de matriz PostgreSQL?
- 9. ¿Cuáles son los casos de uso para las funciones de cierre/devolución de llamada en JavaScript?
- 10. ¿Cuáles son los buenos casos de uso para las tuplas en C++ 11?
- 11. ¿Cuáles son los casos de uso adecuados para process.nextTick en Node.js?
- 12. ¿Cuáles son los beneficios de Scala?
- 13. ¿Cómo uso las compilaciones nocturnas de Scala 2.9 con maven?
- 14. Casos de uso para IdentityHashMap
- 15. settings.maxPrintString para Scala 2.9 REPL
- 16. ¿Cuáles son los casos de uso de TPL flujo de datos sobre extensiones reactivas (Rx)
- 17. ¿Cuáles son las limitaciones de los Manifiestos de Scala?
- 18. ¿Cuáles son los casos de uso válidos de goto en PHP?
- 19. ¿Cuáles son los diferentes casos de uso de joblib versus pickle?
- 20. ¿Cuáles son los casos de uso para tener un retorno de función por valor de const para tipo no incorporado?
- 21. Scala 2.9 Puente-Método
- 22. ¿Qué son los casos de uso de zeromq?
- 23. ¿Cuáles son algunos casos de uso común para usar el Microkernel Akka?
- 24. ¿Cuáles son los principales cambios de scala 2.8.1 a scala 2.9.1?
- 25. ¿Qué cosas de las clases de casos se eliminarán después de Scala 2.9 exactamente?
- 26. Los casos de uso para @WebInitParam
- 27. Casos de uso para utilidades concurrentes Java
- 28. Casos de uso para los diferentes haml helpers de Padrino
- 29. Casos de uso para NoSQL
- 30. ¿Qué son casos de uso para una corrutina?
No estoy seguro de que lo usaría ... pero puede usar * any * (conforme) PartialFunction ... ¿ha manejado un error unificado en otro lugar? (Diga 'ignoreTheseSillyClosableExceptions'.) Además," es genial "que Scala pueda expresarlo así ;-) –
Para inspiración: Paul Phillips brindó un ejemplo motivacional cuando implementó esto: http://www.scala-lang.org/node/8070 –
La pregunta sería mejor con un ejemplo o al menos un enlace. – ziggystar