Me encuentro repitiendo bloques simples try/catch que deberían, IMO, ser 1-liners.Scala DRYing try/catch
Por ejemplo, supongamos que necesito convertir una fecha de uri string en formato aaaammdd a Joda-Time. Con un try/catch estándar bloquear el método de conversión se ve así:
def ymd2Date(ymd: Option[String]) = ymd match {
case Some(date) =>
try { Right(ymdFormat.parseDateTime(date)) }
catch { case e =>
log.info(e.getMessage)
Left(None)
}
case None =>
Left(None) // no uri date param
}
val ymdFormat = DateTimeFormat.forPattern("yyyyMMdd")
funciona bastante bien, la intención es clara, pero cuando lo haga este tipo de try/catch registro para todos eventos sin gravedad, entonces yo busca una forma de SECARLO. La búsqueda me llevó a este SO post en scala.util.control.Exception. Útil, pero aún es un poco difícil asimilarlo/hacerlo funcionar de la manera que me gustaría. En lenguaje simple solo quiero decir, "atrapar algo de acción obtener resultado log-error-type".
lo tanto, me han pirateado esto en base a la parte de control.Exception Me interesa (o entender para ser útil):
class Catcher[T](f: => T) {
type Logger = (=> Any) => Unit
def either[T](logger: => Logger) = {
try { Right(f) }
catch { case e =>
logger(e.getMessage)
Left(None)
}
}
}
def catching[T](f: => T) = new Catcher(f)
y luego usar en lugar del try/catch de este modo:
catching(ymdFormat.parseDateTime(date)) either log.info
puede añadir en opción, un prefijo msg, etc., pero ... probablemente sería mejor encontrar una manera de conseguir control.Exception funcione como el de arriba, mientras que el equipo va a typesafe producir mundos de código mejor de lo que alguna vez imaginaría escribir.
¿Alguien sabe cómo crear este tipo de sintaxis usando control. ¿Existe una excepción en la que se puede pasar un nombre de función de registrador para usar en el bloque catch?
Sería muy bueno si había una "casos de uso" para control.Exception, pero tengo la sensación de esta utilidad es para más desarrolladores avanzados Scala
¿Por qué usas 'Oither'? Si todo lo que va a poner en 'Left' es 'None', entonces parece que podría usar 'Option [T]'. – huynhjl
buen punto, quería doblar el resultado y cualquiera de los dos parecía un ajuste natural ... – virtualeyes
, es decir, actualmente no hay opción de plegado, o al menos no está incorporado en el idioma – virtualeyes