我的代码抛出异常(由于错误)。在日志中,我看到:
org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException
at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:323)
at org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:199)
at org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:175)
at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:529)
etc...
未记录实际异常的堆栈。如果我将代码包装在try..catch
中并记录捕获的异常,我可以验证我的代码是否有错。我的系统中没有其他库可以做到这一点,即使对于深度包装的异常,所以它一定是RESTEasy中的一个问题,可能在UnhandledException
中?
有没有办法绕过这种行为?我想不出它应该隐藏实际异常的一个很好的理由。
答案 0 :(得分:1)
你有ExceptionMapper吗?请参阅RESTEasy文档中的第27章“异常处理”。
我使用RESTEasy将REST添加到现有系统中,而现有系统有一种奇怪的方法来包含异常中的异常,因此我的ExceptionMappers会进行大量的解包。
Throwable t = exception;
while (t.getCause() != null) {
t = t.getCause();
}
t.printStackTrace();
答案 1 :(得分:0)
我不使用RESTeasy,但它似乎是RESTful Web服务的调度机制。
假设是这种情况,那么它与其他库有不同的设计目标:它们是从您的应用程序调用的,但RESTeasy负责调用您的应用程序。因此,它必须保护自己免受编写不良的代码。 “最后沟渠”异常处理程序是执行此操作的常用方法;你会在Swing中看到同样的事情。
是否应记录未捕获的异常是另一回事。也许有一个配置选项来做到这一点。或者您可能需要添加几行代码。毕竟,它是开源的,我确信维护人员会很喜欢带有补丁的精心编写的错误报告。
答案 2 :(得分:0)
是的,您的异常被RESTeasy吞噬,包含在UnhandledException中并被记录。但你的例外情况太深入,无法包含在stacktrac中。
要将您的异常打印到控制台,您可以将以下内容附加到'WEB-INF / classes / logging.properties'
org.apache.catalina.core.ContainerBase.[Catalina].level = FINEST
org.apache.catalina.core.ContainerBase.[Catalina].handlers = java.util.logging.ConsoleHandler