Mi trovo a ripetere semplici blocchi try/catch che dovrebbero, IMO, essere 1-liner.Scala DRYing try/catch
Ad esempio, supponiamo di dover convertire una data stringa uri nel formato yyyymmdd in Joda-Time. Con uno standard try/catch bloccare il metodo di conversione appare come:
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")
funziona abbastanza bene, l'intento è chiaro, ma quando faccio questo tipo di try/catch registrazione per tutti eventi non critici, poi ho cercare un modo per ASCIUGARLA. La ricerca mi ha portato a questo SO post su scala.util.control.Exception. Utile, ma è ancora un po 'difficile da convincere/farlo funzionare nel modo in cui mi piacerebbe farlo. In parole povere voglio solo dire "catch-get-get log-error-type" di qualche azione.
Così, ho inciso questo fuori in base alla parte del control.Exception mi interessa (o capire di essere utile):
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)
e quindi utilizzare al posto di try/catch in questo modo:
catching(ymdFormat.parseDateTime(date)) either log.info
possono aggiungere in opzione, un prefisso msg, ecc, ma ... probabilmente sarebbe meglio trovare un modo per ottenere control.Exception per funzionare come sopra, come l'equipaggio Typesafe sta per produrre mondi di codice migliori di quanto immaginerei mai di scrivere.
Qualcuno sa come creare questo tipo di sintassi utilizzando control.Exception dove si può passare in una funzione di logger per nome da utilizzare nel blocco catch?
sarebbe bello se ci fosse un "casi d'uso" per control.Exception, ma ho la sensazione questa utility è per maggiori sviluppatori Scala avanzate
Perché usi 'O'? Se tutto quello che stai per mettere in 'Left' è' None', sembra che tu possa usare 'Option [T]'. – huynhjl
buon punto, volevo piegare il risultato e O sembrava un adattamento naturale ... – virtualeyes
che vuol dire che al momento non esiste un'opzione di piegatura, o almeno non incorporata nella lingua – virtualeyes