scala - 在 Scala 中处理和抛出异常
问题描述
我有以下实现:
val dateFormats = Seq("dd/MM/yyyy", "dd.MM.yyyy")
implicit def dateTimeCSVConverter: CsvFieldReader[DateTime] = (s: String) => Try {
val elem = dateFormats.map {
format =>
try {
Some(DateTimeFormat.forPattern(format).parseDateTime(s))
} catch {
case _: IllegalArgumentException =>
None
}
}.collectFirst {
case e if e.isDefined => e.get
}
if (elem.isDefined)
elem.get
else
throw new IllegalArgumentException(s"Unable to parse DateTime $s")
}
所以基本上我正在做的是,我正在运行我的 Seq 并尝试用不同的格式解析 DateTime。然后我收集第一个成功的,如果没有,我把异常扔回去。
我对代码并不完全满意。有没有更好的方法让它变得更简单?我需要将异常消息传递给调用者。
解决方案
您的代码的一个问题是,无论日期是否已被解析,它都会尝试所有模式。你可以使用惰性收集,比如 Stream 来解决这个问题:
def dateTimeCSVConverter(s: String) = Stream("dd/MM/yyyy", "dd.MM.yyyy")
.map(f => Try(DateTimeFormat.forPattern(format).parseDateTime(s))
.dropWhile(_.isFailure)
.headOption
更好的是 jwvh 提出的带有 find 的解决方案(您不必调用headOption
):
def dateTimeCSVConverter(s: String) = Stream("dd/MM/yyyy", "dd.MM.yyyy")
.map(f => Try(DateTimeFormat.forPattern(format).parseDateTime(s))
.find(_.isSuccess)
None
如果没有匹配的模式,则返回。如果你想在这种情况下抛出异常,你可以使用 uwrap 选项getOrElse
:
...
.dropWhile(_.isFailure)
.headOption
.getOrElse(throw new IllegalArgumentException(s"Unable to parse DateTime $s"))
重要的是,当任何验证成功时,它不会更进一步,而是会立即返回解析日期。
推荐阅读
- ajax - JSF:如何在父元素的复合组件中获取 id
- svelte - 如何在 Svelte 3 中有条件地添加和删除`use:`属性?
- c# - WPF 验证错误消息在字段有效之前不会触发
- java - 从 Firebase 获取数据并同时将其放在那里
- javascript - 如何将 Puppeteer“页面”实例传递给 Mocha 自定义报告?
- wordpress - WP 网站重定向到每个新设备中的订单接收页面
- ios - 在前端集成 Plaid API?
- jsp - JSP 代码在较长的用户名上中断
- python - 在 FTPS 服务器上使用 ftplib 列出目录时,sslobj.do_handshake 中的“OSError:[Errno 0] 错误”
- xml - 由 H2 DB 支持的 REST API 在插入带有 XML 字符串的行时的行为与 IBM DB2 不同