java抛出异常,以便堆栈跟踪不包含某些类类型
有可能这样做吗
问题是,例如,大型应用程序有大量的servlet过滤器。每个关于http请求抛出的异常都包含250行,其中160行来自catalina/tomcat堆栈,这绝对不重要
拥有250行长的堆栈跟踪是非常困难的
你可以在下面搜索框中键入要查询的问题!
有可能这样做吗
问题是,例如,大型应用程序有大量的servlet过滤器。每个关于http请求抛出的异常都包含250行,其中160行来自catalina/tomcat堆栈,这绝对不重要
拥有250行长的堆栈跟踪是非常困难的
# 1 楼答案
我同情。 隐藏不需要的StackTraceElements并生成自己的stacktrace输出怎么样
比如:
您可以在自定义记录器中使用这样的代码。您还可以使用它记录未捕获的异常:
# 2 楼答案
您可以创建一个outputstream,该outputstream读取行,并删除与特定正则表达式匹配的行
然后使用异常。printStackTrace(您的过滤器输出流)
如果您使用的是log4j,那么可以编写一个Appender来实现这一点
Log4j配置(Examples)使用假设的Appender:
我可能会将FileAppender子类化:
# 3 楼答案
对于捕获的异常,可以从堆栈跟踪中删除条目。您可以覆盖例外的printStackTrace。您还可以创建一个自定义记录器来忽略某些行。这在很大程度上取决于你能控制什么
# 4 楼答案
这有点过时,但无论如何,如果使用Log4J或SL4J,可以将属性设置为仅显示所需的项目。它很灵活
# 5 楼答案
是的,可以操纵堆栈跟踪。如前所述,这取决于你想(并且能够)解决问题的地方
例如:
对于我为我们的项目实现的远程方法调用协议,如果出现异常,我们在目标端捕获它,切断较低的一些StackTraceElements(它们总是相同的,直到使用反射实际调用目标方法),并将异常以及堆栈跟踪的重要部分发送到调用方
在那里,我用异常的(已发送的)堆栈跟踪重建异常,然后将其与当前堆栈跟踪合并。 为此,我们还删除了当前堆栈跟踪的顶部部分元素(仅包含远程调用框架的调用):
例如,这将提供以下跟踪:
当然,对于您的情况,您最好简单地遍历数组,将重要元素复制到列表中,然后将其设置为新的stackTrace。也要确保这样做的原因(即链接的一次性物品)
您可以在异常的构造函数中,或者在打印堆栈跟踪的地方,或者在两者之间的任何地方(捕捉、操作和重新显示异常的地方)执行此操作