tutorial programming learn koans functional exercises codecademy scala functional-programming

programming - try y catch funcional con Scala



scala programming (3)

El patrón de préstamo se implementa de varias maneras en la biblioteca scala-arm de Josh Suereth en github.

A continuación, puede utilizar un recurso como este:

val result = managed(new FileInputStream(in)).map(func(_)).opt

que devolvería el resultado del func envuelto en una Option y se encargaría de cerrar el flujo de entrada.

Para tratar las posibles excepciones al crear el recurso, puede combinarlo con el objeto scala.util.control.Exception :

import resource._ import util.control.Exception.allCatch allCatch either { managed(new FileInputStream(in)).map(func(_)).opt } match { case Left(exception) => println(exception) case Right(Some(result)) => println(result) case _ => }

¿Existe una forma más idónea de abrir un recurso en Scala y aplicarle métodos que este método (transferido directamente desde Java), usar vals pero también incluir el fin, etc.

var is:FileInputStream = null try { is = new FileInputStream(in) func(is) } catch { case e:IOException => println("Error: could not open file.") println(" -> " + e) exit(1) } finally { if(is) is.close() }


Ese podría ser un caso en el que no es deseable que funcione. El patrón de préstamo ya mencionado es solo una descripción de la versión imparativa del manejo de errores, pero eso no tiene nada que ver con la programación funcional, y también se ocupa del manejo de errores.

Si realmente lo quería funcional, podría hacerlo con un error al manejar la mónada . Por buenas razones, el enlace que proporciono es documentación específica de Haskell, ya que Scala no está apoyando tan bien este tipo de práctica funcional "hardcore".

Le recomiendo que vaya por el camino imperativo y use try catch finalmente ... también puede extender el patrón de préstamo con el manejo de errores, pero eso significa que tiene que escribir funciones especiales si desea tratar los errores de forma diferente en algunas situaciones o tendría que pasar por alto una función parcial para el manejo de errores (que no es más que lo que ya obtuviste dentro del bloque catch en tu código).