【发布时间】:2018-04-05 16:08:13
【问题描述】:
在我的 Scalatra 路由中,我经常使用 halt() 快速失败:
val user: User = userRepository.getUserById(params("userId"))
.getOrElse {
logger.warn(s"Unknown user: $userId")
halt(404, s"Unknown user: $userId")
}
如示例所示,我还想在这些情况下记录警告。但我想避免halt() 和记录器之间的代码重复。这样做会更干净:
val user: User = userRepository.getUserById(params("userId"))
.getOrElse(halt(404, s"Unknown user: $userId"))
以横切方式记录所有“HaltExceptions”的最佳方式是什么?
我考虑过:
1) 在我的路由中覆盖halt() 方法:
override def halt[T](status: Integer, body: T, headers: Map[String, String])(implicit evidence$1: Manifest[T]): Nothing = {
logger.warn(s"Halting with status $status and message: $body")
super.halt(status, body, headers)
}
除了奇怪的方法签名之外,我不太喜欢这种方法,因为我可能会错误地调用真正的 halt() 而不是覆盖的方法,例如,如果我在路线外停下来。在这种情况下,不会记录任何警告。
2) 使用trap() 记录所有错误响应:
trap(400 to 600) {
logger.warn(s"Error returned with status $status and body ${extractBodyInSomeWay()}")
}
但我不确定这是不是最好的方法,特别是因为它向 _statusRoutes 映射添加了 201 条路由(范围内的每个整数都有一个映射......)。我也不知道怎么提取这里的尸体?
3) 在 Jetty 中为特定状态代码启用某种响应日志记录?
最好的方法是什么?我是否正确地接近这个?
【问题讨论】: