Да, можно манипулировать трассировкой стека.Как уже говорилось, это зависит от того, где вы хотите (и можете) атаковать проблему.
Например:
Для протокола удаленного вызова метода, который я реализовал для нашего проекта,в случае исключения мы перехватываем его на целевой стороне, обрезаем несколько нижних 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.Удостоверьтесь, что вы делаете это и для причин (т. Е. Связанных метаний).
Вы можете сделать это в конструкторе ваших исключений, или там, где вы печатаете трассировки стека, или где-нибудь между (где вы ловите, манипулируетеи отбросить исключение).