summaryrefslogtreecommitdiffstats
path: root/server/src
diff options
context:
space:
mode:
authorMatti Tahvonen <matti@vaadin.com>2013-12-29 16:06:49 +0200
committerVaadin Code Review <review@vaadin.com>2014-03-06 11:15:40 +0000
commite888353d74380e16eda17db565caa977a2d53bfa (patch)
tree38e0529fdfa9d0f5f3b465f63ee7c4c9efbe0c9d /server/src
parent6acf4ef8faac8de4b9ced076811582556a9c8ef0 (diff)
downloadvaadin-framework-e888353d74380e16eda17db565caa977a2d53bfa.tar.gz
vaadin-framework-e888353d74380e16eda17db565caa977a2d53bfa.zip
Default error handler now report relevant exceptions (#11599)
Change-Id: Ia2ff7a5ccc24f183f0345149678ced0e76818380
Diffstat (limited to 'server/src')
-rw-r--r--server/src/com/vaadin/server/DefaultErrorHandler.java41
1 files changed, 40 insertions, 1 deletions
diff --git a/server/src/com/vaadin/server/DefaultErrorHandler.java b/server/src/com/vaadin/server/DefaultErrorHandler.java
index 2f46354500..f8b684f1d1 100644
--- a/server/src/com/vaadin/server/DefaultErrorHandler.java
+++ b/server/src/com/vaadin/server/DefaultErrorHandler.java
@@ -16,11 +16,14 @@
package com.vaadin.server;
+import java.lang.reflect.InvocationTargetException;
import java.net.SocketException;
import java.util.logging.Level;
import java.util.logging.Logger;
+import com.vaadin.event.ListenerMethod.MethodException;
import com.vaadin.server.ClientConnector.ConnectorErrorEvent;
+import com.vaadin.server.ServerRpcManager.RpcInvocationException;
import com.vaadin.shared.Connector;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.Component;
@@ -32,7 +35,7 @@ public class DefaultErrorHandler implements ErrorHandler {
}
public static void doDefault(ErrorEvent event) {
- final Throwable t = event.getThrowable();
+ Throwable t = event.getThrowable();
if (t instanceof SocketException) {
// Most likely client browser closed socket
getLogger().info(
@@ -41,6 +44,8 @@ public class DefaultErrorHandler implements ErrorHandler {
return;
}
+ t = findRelevantThrowable(t);
+
// Finds the original source of the error/exception
AbstractComponent component = findAbstractComponent(event);
if (component != null) {
@@ -54,6 +59,40 @@ public class DefaultErrorHandler implements ErrorHandler {
getLogger().log(Level.SEVERE, "", t);
}
+ /**
+ * Vaadin wraps exceptions in its own and due to reflection usage there
+ * might be also other irrelevant exceptions that make no sense for Vaadin
+ * users (~developers using Vaadin). This method tries to choose the
+ * relevant one to be reported.
+ *
+ * @since 7.2
+ * @param t
+ * throwable given for default error handler
+ * @return the throwable that is relevant for Vaadin users
+ */
+ private static Throwable findRelevantThrowable(Throwable t) {
+ try {
+ if ((t instanceof RpcInvocationException)
+ && (t.getCause() instanceof InvocationTargetException)) {
+ /*
+ * RpcInvocationException (that always wraps irrelevant
+ * java.lang.reflect.InvocationTargetException) might only be
+ * relevant for core Vaadin developers.
+ */
+ return findRelevantThrowable(t.getCause().getCause());
+ } else if (t instanceof MethodException) {
+ /*
+ * Method exception might only be relevant for core Vaadin
+ * developers.
+ */
+ return t.getCause();
+ }
+ } catch (Exception e) {
+ // NOP, just return the original one
+ }
+ return t;
+ }
+
private static Logger getLogger() {
return Logger.getLogger(DefaultErrorHandler.class.getName());
}