private void printScriptFrames(StringBuilder sb, Realm realm, Throwable e, int level) { final String indent = Strings.repeat('\t', level); final int maxDepth = options.stacktraceDepth; int depth = 0; StackTraceElement[] stackTrace = StackTraces.scriptStackTrace(e); for (; depth < Math.min(stackTrace.length, maxDepth); ++depth) { StackTraceElement element = stackTrace[depth]; String methodName = element.getMethodName(); String fileName = element.getFileName(); int lineNumber = element.getLineNumber(); sb.append(indent) .append("at ") .append(methodName) .append(" (") .append(fileName) .append(':') .append(lineNumber) .append(")\n"); } if (depth < stackTrace.length) { int skipped = stackTrace.length - depth; sb.append("\t.. ").append(skipped).append(" frames omitted\n"); } if (e.getSuppressed().length > 0 && level == 1) { Throwable suppressed = e.getSuppressed()[0]; String message; if (suppressed instanceof ScriptException) { message = ((ScriptException) suppressed).getMessage(realm.defaultContext()); } else { message = Objects.toString(suppressed.getMessage(), suppressed.getClass().getSimpleName()); } sb.append(indent).append(formatMessage("suppressed_exception", message)).append('\n'); printScriptFrames(sb, realm, suppressed, level + 1); } }
static StackTraceElement[] truncate(Throwable e, int depth) { StackTraceElement[] stackTrace = e.getStackTrace(); if (stackTrace.length > depth) { int omitted = stackTrace.length - depth; stackTrace = Arrays.copyOf(stackTrace, depth + 1); stackTrace[depth] = new StackTraceElement("..", "", "Frames omitted", omitted); } if (REMOVE_PACKAGE_NAME) { for (int i = 0; i < stackTrace.length; ++i) { StackTraceElement element = stackTrace[i]; String className = element.getClassName(); if (className.startsWith(PACKAGE_NAME)) { stackTrace[i] = new StackTraceElement( className.substring(PACKAGE_NAME.length()), element.getMethodName(), element.getFileName(), element.getLineNumber()); } } } return stackTrace; }