当前位置: 首页 > 面试题库 >

如何在没有堆栈跟踪的情况下创建/抛出异常?

徐文彬
2023-03-14
问题内容

我今天在浏览一些日志时遇到一个奇怪的错误。

它在日志中的显示方式如下:

2014/09/11 15:23:52.801 [CC3A5FDD16035540B87F1B8C5E806588:<removed>] WARN a.b.c.Ddd - Main failure 
java.lang.NullPointerException: null
2014/09/11 15:23:52.801 [CC3A5FDD16035540B87F1B8C5E806588:<removed>] ...

代码如下所示:

} catch (Exception e) {
    Ddd.log.warn("Main failure ", e);
    throw e;
}

如果重要的话,代码位于jsp中。再次在日志中重复相同的异常(正如您期望的那样throw e)。

我没有任何原因的记录-日志中的上一行显示了查询的执行。在4天的时间内仅发生了两次,似乎并未对系统造成任何损害。

环境:在Java 5的Tomcat下运行的非常繁忙的Web服务。

我并没有要求调试系统的提示-这些错误已久,甚至可能再也不会发生。我只是很困惑如何在没有堆栈跟踪的情况下创建任何异常(特别是NPE)?

添加

使用的记录器是slf4j驱动Logback实例。我相信warn方法就在这里。不确定Logback解析为哪种方法,但是我相信Throwable参数会被特别对待,并且如果附加了堆栈跟踪Throwable
它将 显示在日志中。

LogBack.xml-根据要求:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property name="log.package" value="Package" />
  <property name="log.pattern" value="%date{yyyy/MM/dd HH:mm:ss.SSS} [%X{session}:%X{device}] %level %logger{25} - %msg%n"/> 
  <property name="log.consolePattern" value="%highlight(%-5level) %white(%logger{25}) - %msg%n"/> 
  <if condition='isDefined("catalina.home")'>
    <then>
      <property name="log.dir" value="${catalina.home}/logs" />
    </then>
    <else>
      <property name="log.dir" value="." />
    </else>
  </if>

  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>DEBUG</level>
    </filter>
    <encoder>
      <Pattern>${log.consolePattern}</Pattern>
    </encoder>
  </appender>

  <appender name="rolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.dir}/${log.package}.log</file>
    <encoder>
      <Pattern>${log.pattern}</Pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${log.dir}/${log.package}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!-- or whenever the file size reaches 16MB. -->
        <maxFileSize>16MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- Keep no more than 3 months data. -->
      <maxHistory>90</maxHistory>
      <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>
  </appender>

  <!-- Default logging levels. -->
  <root level="INFO">
    <appender-ref ref="console"/>
    <appender-ref ref="rolling"/>
  </root>
  <!-- Specific logging levels. -->
  <!-- Generally set to INFO or ERROR but if you need more details, set to DEBUG. -->
  <logger name="org.apache" level="INFO"/>
  <logger name="net.sf.ehcache" level="ERROR"/>
  <logger name="com.zaxxer" level="ERROR"/>
  <logger name="ch.qos" level="ERROR"/>
</configuration>

我手动编辑了日志中会话ID之后的值,以删除客户数据。


问题答案:

有时,特别是涉及到NullPointers时(以我的经验),jvm可以优化异常的创建和强制转换,并且堆栈跟踪会丢失(或更准确地说,从不创建)。我怀疑您的问题与某些Java库无关,而与jvm本身有关。

如果您在启动jvm进程时添加了此参数,并且我怀疑是正确的,那么您将获得堆栈跟踪。

-XX:-OmitStackTraceInFastThrow

注意,这适用于sun / oracle jvm



 类似资料:
  • Edit2 @Paradematic在建议重定向而不是抛出异常方面做得很好;这解决了日志记录问题。Play 2中的问题是,重定向需要发生在所谓的范围内,而日期解析器调用并不总是这样。 最初的 有一个问题,即我的application.log被与uri日期解析器操作相关的错误填满,如果给定有效的uri日期,该操作应该成功。 然而,一些用户试图通过输入无效日期来规避这一点,希望获得免费访问付费订阅者专

  • 问题内容: 更新 :Intellij IDEA的最新版本完全实现了我想要的功能。问题是如何在IDE外部实现此功能(以便我可以将异步堆栈跟踪信息转储到日志文件中),理想情况下无需使用检测代理。 自从我将应用程序从同步模型转换为异步模型以来,调试故障一直遇到问题。 当我使用同步API时,我总是在异常stacktraces中找到我的类,因此我知道从哪里开始寻找问题。使用异步API,我得到的堆栈跟踪既不引

  • 问题内容: 在C#中,我可以使用该语句在保留堆栈跟踪的同时重新引发异常: Java中是否有类似的东西( 不会丢失原始堆栈跟踪 )? 问题答案: 只会简单地抛出您捕获的异常(显然,周围的方法必须通过其签名等方式允许此异常)。该异常将保留原始堆栈跟踪。

  • 我有一个rest web服务。如果抛出任何异常,web服务将返回http 500错误。但我不想发送这个带有异常堆栈跟踪的错误响应。我只想发送错误代码和错误消息。我没有做到这一点。我怎么能这么做? 我已经尝试过@ControllerAdvice和@ExceptionHandler注释,但我做不到。当我使用@ResponseStatus注释时,总是发送静态“reason”值。如何设置此值?谢谢你的帮助

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

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