diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ForeignExceptionUtil.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ForeignExceptionUtil.java index a0006ed..70eced7 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ForeignExceptionUtil.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ForeignExceptionUtil.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hbase.util; import java.io.IOException; +import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; @@ -37,6 +38,24 @@ import org.apache.hadoop.hbase.protobuf.generated.ErrorHandlingProtos.StackTrace public final class ForeignExceptionUtil { private ForeignExceptionUtil() { } + public static Exception toException(final ForeignExceptionMessage eem) { + final GenericExceptionMessage gem = eem.getGenericException(); + final StackTraceElement[] trace = toStackTrace(gem.getTraceList()); + try { + Class realClass = Class.forName(gem.getClassName()); + Class cls = realClass.asSubclass(Exception.class); + Constructor cn = cls.getConstructor(String.class); + cn.setAccessible(true); + Exception re = cn.newInstance(gem.getMessage()); + re.setStackTrace(trace); + return re; + } catch (Exception e) { + Exception re = new Exception(gem.getMessage()); + re.setStackTrace(trace); + return re; + } + } + public static IOException toIOException(final ForeignExceptionMessage eem) { GenericExceptionMessage gem = eem.getGenericException(); StackTraceElement[] trace = toStackTrace(gem.getTraceList()); diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureException.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureException.java index 551a708..b640547 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureException.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureException.java @@ -18,14 +18,13 @@ package org.apache.hadoop.hbase.procedure2; -import java.io.IOException; - import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.classification.InterfaceStability; +import org.apache.hadoop.hbase.exceptions.HBaseException; @InterfaceAudience.Private @InterfaceStability.Stable -public class ProcedureException extends IOException { +public class ProcedureException extends HBaseException { /** default constructor */ public ProcedureException() { super(); diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/RemoteProcedureException.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/RemoteProcedureException.java index 71aae84..456f83d 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/RemoteProcedureException.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/RemoteProcedureException.java @@ -111,6 +111,6 @@ public class RemoteProcedureException extends ProcedureException { } public static RemoteProcedureException fromProto(final ForeignExceptionMessage eem) { - return new RemoteProcedureException(eem.getSource(), ForeignExceptionUtil.toIOException(eem)); + return new RemoteProcedureException(eem.getSource(), ForeignExceptionUtil.toException(eem)); } }