gpt4 book ai didi

Scala DRYing try/catch

转载 作者:行者123 更新时间:2023-12-04 11:12:24 24 4
gpt4 key购买 nike

我发现自己在重复简单的 try/catch 块,IMO 应该是 1-liners。

例如,假设我需要将 yyyymmdd 格式的 uri 字符串日期转换为 Joda-Time。使用标准的 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 post在 scala.util.control.Exception 上。有帮助,但仍然有点难以理解/让它以我想要的方式工作。用简单的英语我只想说,“catch some-action get-result log-error-type”。

因此,我根据我感兴趣的 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 开发人员

最佳答案

这应该做你想做的:

import scala.util.control.Exception
def log(logger: => Logger)(e: Throwable) = {
logger(e.getMessage)
None
}
Exception.allCatch withApply log(logger) apply Some(ymdFormat.parseDateTime(date))

但是这种东西最好由Scalaz处理 Validation , 在我看来。

关于Scala DRYing try/catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10110457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com