in gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/AbstractSession.java [295:384]
protected void handleException(final SessionTask sessionTask, final Throwable t) throws SessionException {
if (t instanceof SessionException) throw (SessionException) t;
final Optional<Throwable> possibleSpecialException = determineIfSpecialException(t);
if (possibleSpecialException.isPresent()) {
final Throwable special = possibleSpecialException.get();
final ResponseMessage.Builder specialResponseMsg = ResponseMessage.build(sessionTask.getRequestMessage()).
statusMessage(special.getMessage()).
statusAttributeException(special);
if (special instanceof TemporaryException) {
specialResponseMsg.code(ResponseStatusCode.SERVER_ERROR_TEMPORARY);
} else if (special instanceof Failure) {
final Failure failure = (Failure) special;
specialResponseMsg.code(ResponseStatusCode.SERVER_ERROR_FAIL_STEP).
statusAttribute(Tokens.STATUS_ATTRIBUTE_FAIL_STEP_MESSAGE, failure.format());
}
throw new SessionException(special.getMessage(), specialResponseMsg.create());
}
final Throwable root = ExceptionHelper.getRootCause(t);
if (root instanceof TimedInterruptTimeoutException) {
// occurs when the TimedInterruptCustomizerProvider is in play
final String msg = String.format("A timeout occurred within the script during evaluation of [%s] - consider increasing the limit given to TimedInterruptCustomizerProvider",
sessionTask.getRequestMessage().getRequestId());
throw new SessionException(msg, root, ResponseMessage.build(sessionTask.getRequestMessage())
.code(ResponseStatusCode.SERVER_ERROR_TIMEOUT)
.statusMessage("Timeout during script evaluation triggered by TimedInterruptCustomizerProvider")
.create());
}
if (root instanceof TimeoutException) {
final String errorMessage = String.format("Script evaluation exceeded the configured threshold for request [%s]",
sessionTask.getRequestMessage().getRequestId());
throw new SessionException(errorMessage, root, ResponseMessage.build(sessionTask.getRequestMessage())
.code(ResponseStatusCode.SERVER_ERROR_TIMEOUT)
.statusMessage(t.getMessage())
.create());
}
if (root instanceof InterruptedException ||
root instanceof TraversalInterruptedException ||
root instanceof InterruptedIOException) {
String msg = "Processing interrupted but the reason why was not known";
switch (closeReason.get()) {
case CHANNEL_CLOSED:
msg = "Processing interrupted because the channel was closed";
break;
case SESSION_TIMEOUT:
msg = String.format("Session closed - %s - sessionLifetimeTimeout of %s ms exceeded", sessionId, actualTimeoutLengthWhenClosed);
break;
case REQUEST_TIMEOUT:
msg = String.format("Evaluation exceeded timeout threshold of %s ms", actualTimeoutLengthWhenClosed);
break;
}
final ResponseStatusCode code = closeReason.get() == CloseReason.SESSION_TIMEOUT || closeReason.get() == CloseReason.REQUEST_TIMEOUT ?
ResponseStatusCode.SERVER_ERROR_TIMEOUT : ResponseStatusCode.SERVER_ERROR;
throw new SessionException(msg, root, ResponseMessage.build(sessionTask.getRequestMessage())
.code(code)
.statusMessage(msg).create());
}
if (root instanceof MultipleCompilationErrorsException && root.getMessage().contains("Method too large") &&
((MultipleCompilationErrorsException) root).getErrorCollector().getErrorCount() == 1) {
final String errorMessage = String.format("The Gremlin statement that was submitted exceeds the maximum compilation size allowed by the JVM, please split it into multiple smaller statements - %s", trimMessage(sessionTask.getRequestMessage()));
logger.warn(errorMessage);
throw new SessionException(errorMessage, root, ResponseMessage.build(sessionTask.getRequestMessage())
.code(ResponseStatusCode.SERVER_ERROR_EVALUATION)
.statusMessage(errorMessage)
.statusAttributeException(root).create());
}
// GroovyRuntimeException will hit a pretty wide range of eval type errors, like MissingPropertyException,
// CompilationFailedException, MissingMethodException, etc. If more specific handling is required then
// try to catch it earlier above.
if (root instanceof GroovyRuntimeException ||
root instanceof VerificationException ||
root instanceof ScriptException) {
throw new SessionException(root.getMessage(), root, ResponseMessage.build(sessionTask.getRequestMessage())
.code(ResponseStatusCode.SERVER_ERROR_EVALUATION)
.statusMessage(root.getMessage())
.statusAttributeException(root).create());
}
throw new SessionException(root.getClass().getSimpleName() + ": " + root.getMessage(), root,
ResponseMessage.build(sessionTask.getRequestMessage())
.code(ResponseStatusCode.SERVER_ERROR)
.statusAttributeException(root)
.statusMessage(root.getMessage()).create());
}