This is an automated email from the ASF dual-hosted git repository.

trohrmann pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git

commit 5d291961604be26f8be1228e2bf68ab39eec30ed
Author: Till Rohrmann <[email protected]>
AuthorDate: Wed Sep 19 17:28:19 2018 +0200

    [hotfix] Add ExceptionUtils#stripException
    
    stripException strips a given throwable from a specified exception type. 
This
    is useful to unwrap exceptions.
---
 .../java/org/apache/flink/util/ExceptionUtils.java | 24 ++++++++++++++--------
 .../org/apache/flink/util/ExceptionUtilsTest.java  | 18 ++++++++++++++++
 2 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/flink-core/src/main/java/org/apache/flink/util/ExceptionUtils.java 
b/flink-core/src/main/java/org/apache/flink/util/ExceptionUtils.java
index 601a252..0ea43ee 100644
--- a/flink-core/src/main/java/org/apache/flink/util/ExceptionUtils.java
+++ b/flink-core/src/main/java/org/apache/flink/util/ExceptionUtils.java
@@ -382,11 +382,7 @@ public final class ExceptionUtils {
         * @return Cause of ExecutionException or given Throwable
         */
        public static Throwable stripExecutionException(Throwable throwable) {
-               while (throwable instanceof ExecutionException && 
throwable.getCause() != null) {
-                       throwable = throwable.getCause();
-               }
-
-               return throwable;
+               return stripException(throwable, ExecutionException.class);
        }
 
        /**
@@ -397,11 +393,23 @@ public final class ExceptionUtils {
         * @return Cause of CompletionException or given Throwable
         */
        public static Throwable stripCompletionException(Throwable throwable) {
-               while (throwable instanceof CompletionException && 
throwable.getCause() != null) {
-                       throwable = throwable.getCause();
+               return stripException(throwable, CompletionException.class);
+       }
+
+       /**
+        * Unpacks an specified exception and returns its cause. Otherwise the 
given
+        * {@link Throwable} is returned.
+        *
+        * @param throwableToStrip to strip
+        * @param typeToStrip type to strip
+        * @return Unpacked cause or given Throwable if not packed
+        */
+       public static Throwable stripException(Throwable throwableToStrip, 
Class<? extends Throwable> typeToStrip) {
+               while 
(typeToStrip.isAssignableFrom(throwableToStrip.getClass()) && 
throwableToStrip.getCause() != null) {
+                       throwableToStrip = throwableToStrip.getCause();
                }
 
-               return throwable;
+               return throwableToStrip;
        }
 
        /**
diff --git 
a/flink-core/src/test/java/org/apache/flink/util/ExceptionUtilsTest.java 
b/flink-core/src/test/java/org/apache/flink/util/ExceptionUtilsTest.java
index 07978a5..fa275d0 100644
--- a/flink-core/src/test/java/org/apache/flink/util/ExceptionUtilsTest.java
+++ b/flink-core/src/test/java/org/apache/flink/util/ExceptionUtilsTest.java
@@ -20,9 +20,12 @@ package org.apache.flink.util;
 
 import org.junit.Test;
 
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -69,4 +72,19 @@ public class ExceptionUtilsTest extends TestLogger {
                        IllegalStateException.class).isPresent());
        }
 
+       @Test
+       public void testExceptionStripping() {
+               final FlinkException expectedException = new 
FlinkException("test exception");
+               final Throwable strippedException = 
ExceptionUtils.stripException(new RuntimeException(new 
RuntimeException(expectedException)), RuntimeException.class);
+
+               assertThat(strippedException, is(equalTo(expectedException)));
+       }
+
+       @Test
+       public void testInvalidExceptionStripping() {
+               final FlinkException expectedException = new FlinkException(new 
RuntimeException(new FlinkException("inner exception")));
+               final Throwable strippedException = 
ExceptionUtils.stripException(expectedException, RuntimeException.class);
+
+               assertThat(strippedException, is(equalTo(expectedException)));
+       }
 }

Reply via email to