Scala DRYing try/catch

я ловлю себя на том, что повторяю простые блоки try/catch, которые должны, по IMO, состоять из 1 -строк.

Например, предположим, что мне нужно преобразовать дату строки uri в формате ггггммдд в время Joda -. Со стандартным блоком try/catch метод преобразования выглядит следующим образом::

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")

Работает достаточно хорошо, цель ясна, но когда я выполняю этот вид регистрации try/catch для всех не-критических событий, тогда Я ищу способ высушить его. Поиск привел меня к этому сообщению SO о scala.util.control.Exception. Полезно, но все еще немного сложно заставить его работать так, как я хотел бы. На простом английском языке я просто хочу сказать: «поймай какое-нибудь -действие, получи -журнал результатов -тип ошибки -».

Итак, я взломал это, основываясь на части контроля. Исключение, которое меня интересует (или я понимаю, что оно полезно):

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)

И затем использовать вместо try/catch вот так:

catching( ymdFormat.parseDateTime(date) ) either log.info

Можно добавить вариант, префикс msg и т. д., но... вероятно, было бы лучше найти способ получить контроль. Исключение для работы, как указано выше, поскольку команда TypeSafe собирается создавать кодовые миры лучше, чем я когда-либо мог себе представить. письмо.

Кто-нибудь знает, как создать такой синтаксис, используя control.Exception, где можно передать функцию регистратора по имени -для использования в блоке catch?

Было бы здорово, если бы были «варианты использования» для control.Exception, но мне кажется, что эта утилита предназначена для более продвинутых разработчиков Scala

7
задан Community 23 May 2017 в 10:08
поделиться