EDIT2
@paradigmatic 在建议重定向而不是抛出异常方面提出了一个很好的观点;解决了日志记录问题。 Play 2 中的问题是重定向需要发生在所谓的 Action
范围内,而日期解析器调用并非总是如此。
作为解决方法,我使用了 Play 的全局拦截器,大概相当于 Java servlet 过滤器。
val ymdMatcher = "\\d{8}".r // matcher for yyyyMMdd URI param
val ymdFormat = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd")
def ymd2Date(ymd: String) = ymdFormat.parseDateTime(ymd)
override def onRouteRequest(r: RequestHeader): Option[Handler] = {
import play.api.i18n.Messages
ymdMatcher.findFirstIn(r.uri) map{ ymd=>
try { ymd2Date( ymd); super.onRouteRequest(r) }
catch { case e:Exception => // kick to "bad" action handler on invalid date
Some(controllers.Application.bad(Messages("bad.date.format")))
}
} getOrElse(super.onRouteRequest(r))
}
编辑
这里有一些可以使用的上下文:
// String "pimp": transforms ymdString.to_date call into JodaTime instance
class String2Date(ymd: String) {
def to_date = {
import play.api.i18n.Messages
try{ ymdFormat.parseDateTime(ymd) }
catch { case e:Exception => throw new NoTrace(Messages("bad.date.format")) }
}
val ymdFormat = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd")
}
@inline implicit final def string2Date(ymd: String) = new String2Date(ymd)
和一个测试自定义异常处理程序:
public class NoTrace extends Exception {
static final long serialVersionUID = -3387516993124229948L;
@Override
public Throwable fillInStackTrace() {
return null;
}
public NoTrace(String message) {
super(message);
}
}
在无效的 yyyyMMdd 字符串上调用日期解析器会在日志中记录 30 行堆栈跟踪(这发生在 Play 框架/Netty 容器的上游,优于默认的 100 行跟踪):
"20120099".to_date
原创
遇到一个问题,我的 application.log 中充满了与 uri 日期解析器操作相关的错误,在给定有效的 yyyyMMdd
uri 日期的情况下应该会成功。
但是,一些用户试图通过输入无效日期来规避这一点,希望能够免费访问仅限订阅者的付费内容。这是毫无意义的,因为它根本行不通,但无论如何,我的应用程序日志中有数 MB 的这些错误跟踪。
有没有办法向日志中抛出真正精简的异常
?我找到了 this SO answer ,但在我的应用程序中,它看起来像容器(Netty 上的 Play 框架)进入混合并将其自己的 30 行堆栈跟踪记录到日志中(30 行比 100 行好,但 29 行仍然太多)
同样,我找到了this thread关于 Java 7 和抑制堆栈跟踪的新选项;然而,出于某种原因,尽管是在 Java 1.7 上,但 Eclipse 配置为 Java 1.7,只有 Throwable 的旧 2 参数方法可用(当我点击 Throwable 类时我确实看到了 4 参数方法;也许是 Scala 2.9.2 库问题?)
无论如何,理想情况下,我可以简单地记录一条1 行异常消息,而不是厨房水槽。
最佳答案
只需在您的自定义异常类中覆盖此方法即可:
@Override
public Throwable fillInStackTrace() {
return this;
}
添加此方法后,您的跟踪方法将不会打印
关于Java 7 : throw exception without stack trace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430292/