gpt4 book ai didi

java - 抛出异常以使堆栈跟踪不包含某些类类型

转载 作者:搜寻专家 更新时间:2023-11-01 01:09:14 25 4
gpt4 key购买 nike

这有可能吗?

问题是,例如,大型应用程序有大量的 servlet 过滤器。并且针对 http 请求抛出的每个异常包含 250 行,而其中 160 行来自 catalina/tomcat 堆栈,这绝对不重要。

并且有 250 行长的堆栈跟踪很难处理。

最佳答案

是的,可以操纵堆栈跟踪。如前所述,这取决于您想要(并且能够)解决问题的位置。


举个例子:

对于我为我们的项目实现的一个远程方法调用协议(protocol),在异常的情况下我们在目标端捕获它,切断较低的一些StackTraceElements(它们总是相同的,直到实际调用目标方法),并将异常和堆栈跟踪的重要部分发送到调用方。

在那里我用它的(发送的)堆栈跟踪重建异常,然后将它与当前堆栈跟踪合并。为此,我们还删除了当前堆栈跟踪的顶部元素(仅包含远程调用框架的调用):

    private void mergeStackTraces(Throwable error)
{
StackTraceElement[] currentStack =
new Throwable().getStackTrace();
int currentStackLimit = 4; // TODO: raussuchen

// We simply cut off the top 4 elements, which is just
// right for our framework. A more stable solution
// would be to filter by class name or such.

StackTraceElement[] oldStack =
error.getStackTrace();
StackTraceElement[] zusammen =
new StackTraceElement[currentStack.length - currentStackLimit +
oldStack.length + 1];
System.arraycopy(oldStack, 0, zusammen, 0, oldStack.length);
zusammen[oldStack.length] =
new StackTraceElement("══════════════════════════",
"<remote call %" +callID+ ">",
"", -3);
System.arraycopy(currentStack, currentStackLimit,
zusammen, oldStack.length+1,
currentStack.length - currentStackLimit);
error.setStackTrace(zusammen);
}

例如,这给出了打印的跟踪:

java.lang.SecurityException: The user example does not exist 
at de.fencing_game.db.userdb.Db4oUserDB.login(Db4oUserDB.java:306)
at de.fencing_game.server.impl.StandardServers$SSServer$1.run(StandardServers.java:316)
at de.fencing_game.server.impl.StandardServers$SSServer$1.run(StandardServers.java:314)
at java.security.AccessController.doPrivileged(Native Method)
at de.fencing_game.server.impl.StandardServers$SSServer.login(StandardServers.java:313)
at de.fencing_game.transport.server.ServerTransport$ConnectionInfo$4.login(ServerTransport.java:460)
at ══════════════════════════.<remote call %2>()
at $Proxy1.login(Unknown Source)
at de.fencing_game.gui.basics.LoginUtils.login(LoginUtils.java:80)
at de.fencing_game.gui.Lobby.connectTo(Lobby.java:302)
at de.fencing_game.gui.Lobby$20.run(Lobby.java:849)

当然,对于您的情况,您最好简单地遍历数组,将重要元素复制到列表中,然后将其设置为新的 stackTrace。确保也针对原因(即链接的 throwable)执行此操作。

您可以在异常的构造函数中执行此操作,或者在打印堆栈跟踪的位置或两者之间的任何位置(捕获、操作和重新抛出异常的位置)。

关于java - 抛出异常以使堆栈跟踪不包含某些类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5679626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com