当前位置: 首页 > 知识库问答 >
问题:

Java7:抛出没有堆栈跟踪的异常

龚奇逸
2023-03-14

Edit2
@Paradematic在建议重定向而不是抛出异常方面做得很好;这解决了日志记录问题。Play 2中的问题是,重定向需要发生在所谓的操作范围内,而日期解析器调用并不总是这样。

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);
  }
}
"20120099".to_date

最初的
有一个问题,即我的application.log被与uri日期解析器操作相关的错误填满,如果给定有效的YYYYMMDDuri日期,该操作应该成功。

然而,一些用户试图通过输入无效日期来规避这一点,希望获得免费访问付费订阅者专用内容的机会。这是毫无意义的,因为它根本不起作用,但不管怎样,我的应用程序日志中有这些错误跟踪的MBs。

是否有一种方法可以将真正裁剪的异常抛到日志中?我找到了这样的答案,但在我的应用程序中,它看起来像容器(Netty上的Play framework)进入了混合,并将自己的30行堆栈跟踪记录到日志(30行比100行好,但29行还是太多了)

类似地,我在Java7和禁止堆栈跟踪的新选项中找到了这个线程;然而,由于某些原因,尽管是在Java1.7上,并且Eclipse配置为Java1.7,但只有旧的Throwable的2 param方法可用(当我单击Throwable类时,我确实看到了4 param方法;可能是Scala2.9.2库的问题?)

无论如何,理想情况下,我可以只记录一行异常消息,而不是厨房水槽。

共有1个答案

耿联
2023-03-14

只需在自定义异常类中重写此方法:

@Override
public Throwable fillInStackTrace() {
    return this;
}      

添加此方法后,您的跟踪方法将不会打印

 类似资料:
  • 问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此

  • 现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?

  • 问题内容: 我今天在浏览一些日志时遇到一个奇怪的错误。 它在日志中的显示方式如下: 代码如下所示: 如果重要的话,代码位于jsp中。再次在日志中重复相同的异常(正如您期望的那样)。 我没有任何原因的记录-日志中的上一行显示了查询的执行。在4天的时间内仅发生了两次,似乎并未对系统造成任何损害。 环境:在Java 5的Tomcat下运行的非常繁忙的Web服务。 我并没有要求调试系统的提示-这些错误已久

  • 我试过大多数设置日志记录/应用程序洞察遥测的组合,下面是我试过的一些东西: 的 方法中的 将添加到中的日志生成器 删除自定义错误页异常处理程序,以防发生影响事件 我在Azure中的Web应用程序上设置了环境变量。 我正在使用以下代码生成应用程序洞察中的异常: 一切都不起作用了,我快疯了!非常感谢任何帮助。

  • 在我们的日志文件中,我们发现以下内容: 只有这一行,没有异常堆栈跟踪。 出现此异常的try块正在执行使用javassist创建的动态生成的Java字节码。 我想知道两件事: : null 丢失的堆栈跟踪,尽管在块内使用调用日志挂钩,这通常会导致完整的堆栈跟踪被打印在日志文件中。 我的问题: > 什么样的代码会导致日志输出“java.lang.ArrayIndexOutOfBoundsExcepti

  • 问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。