diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/EvalException.java | 7 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/EvalExceptionWithStackTrace.java | 31 |
2 files changed, 35 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java index 32f289b180..0382079414 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java @@ -70,8 +70,11 @@ public class EvalException extends Exception { if (message == null) { message = ""; } - if (cause != null && !message.contains(cause.getMessage())) { - message = message + (message.isEmpty() ? "" : ": ") + cause.getMessage(); + if (cause != null) { + String causeMsg = cause.getMessage(); + if (causeMsg != null && !message.contains(causeMsg)) { + message = message + (message.isEmpty() ? "" : ": ") + causeMsg; + } } if (message.isEmpty()) { LoggingUtil.logToRemote(Level.SEVERE, "Invalid EvalException", cause); diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalExceptionWithStackTrace.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalExceptionWithStackTrace.java index d967962229..d1baabc5fd 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/EvalExceptionWithStackTrace.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalExceptionWithStackTrace.java @@ -30,7 +30,7 @@ public class EvalExceptionWithStackTrace extends EvalException { private StackTraceElement mostRecentElement; public EvalExceptionWithStackTrace(Exception original, Location callLocation) { - super(callLocation, original.getMessage(), original.getCause()); + super(callLocation, getNonEmptyMessage(original), original.getCause()); } /** @@ -215,4 +215,33 @@ public class EvalExceptionWithStackTrace extends EvalException { output.addLast(message); } } + + /** + * Returns a non-empty message for the given exception. + * + * <p> If the exception itself does not have a message, a new message is constructed from the + * exception's class name. + * For example, an IllegalArgumentException will lead to "Illegal Argument". + */ + private static String getNonEmptyMessage(Exception original) { + Preconditions.checkNotNull(original); + String msg = original.getMessage(); + if (msg != null && !msg.isEmpty()) { + return msg; + } + + char[] name = original.getClass().getSimpleName().replace("Exception", "").toCharArray(); + boolean first = true; + StringBuilder builder = new StringBuilder(); + + for (char current : name) { + if (Character.isUpperCase(current) && !first) { + builder.append(" "); + } + builder.append(current); + first = false; + } + + return builder.toString(); + } } |