Java 7 : throw exception without stack trace

标签 java scala stack-trace suppress

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/

相关文章:

java - TomEE 中的 Tomcat 7 不维护 session ;未发送 JSESSIONID cookie

java - 有没有办法在新的导航组件上按下后恢复 recyclerview 上的状态

java - 等待 Executor 中的所有线程完成?

java - 您如何运行 SecureSocial 演示?

java - 反射获取特定类中带注释的所有方法

c - Windbg 堆栈跟踪显示宏扩展之前或之后的行号

java - 欧拉计划,问题 2- Java

scala - 如何关闭枚举文件?

python - 如何在 TestCase 子类中隐藏堆栈帧?

php - 如何在 PHP 中查看完整的堆栈跟踪?