diff --git a/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/AbstractContractCode.java b/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/AbstractContractCode.java
index f5b866c8..e9afd83d 100644
--- a/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/AbstractContractCode.java
+++ b/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/AbstractContractCode.java
@@ -76,15 +76,13 @@ public abstract class AbstractContractCode implements ContractCode {
BytesValueList bytesValues = eventContext.getArgs();
Object[] args = BytesValueEncoding.decode(bytesValues, handleMethod.getParameterTypes());
- try {
- retn = ReflectionUtils.invokeMethod(handleMethod, contractInstance, args);
- } catch (Throwable e) {
- throw new ContractExecuteException(String.format("Contract[%s:%s] has no handle method to handle event[%s]!", address.toString(),
- contractDefinition.getType().getName(), eventContext.getEvent()));
- }
+ retn = ReflectionUtils.invokeMethod(handleMethod, contractInstance, args);
} catch (Exception e) {
error = e;
+ } catch (Error e) {
+ throw new ContractExecuteException(String.format("Contract[%s:%s] has no handle method to handle event[%s]!", address.toString(),
+ contractDefinition.getType().getName(), eventContext.getEvent()));
}
if (evtProcAwire != null) {
diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractExecuteException.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractExecuteException.java
index 87b5779e..fce0e7a3 100644
--- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractExecuteException.java
+++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractExecuteException.java
@@ -13,6 +13,7 @@ public class ContractExecuteException extends LedgerException {
public ContractExecuteException(String message, Throwable cause) {
super(message, cause);
+ setState(TransactionState.CONTRACT_EXECUTE_ERROR);
}
public ContractExecuteException() {
diff --git a/source/runtime/runtime-context/pom.xml b/source/runtime/runtime-context/pom.xml
index be55a091..d73390c6 100644
--- a/source/runtime/runtime-context/pom.xml
+++ b/source/runtime/runtime-context/pom.xml
@@ -15,5 +15,11 @@
utils-common
${project.version}
+
+
+ com.jd.blockchain
+ ledger-model
+ ${project.version}
+
\ No newline at end of file
diff --git a/source/runtime/runtime-context/src/main/java/com/jd/blockchain/runtime/AbstractModule.java b/source/runtime/runtime-context/src/main/java/com/jd/blockchain/runtime/AbstractModule.java
index e7045d68..e3faa296 100644
--- a/source/runtime/runtime-context/src/main/java/com/jd/blockchain/runtime/AbstractModule.java
+++ b/source/runtime/runtime-context/src/main/java/com/jd/blockchain/runtime/AbstractModule.java
@@ -3,6 +3,7 @@ package com.jd.blockchain.runtime;
import java.io.InputStream;
import java.util.concurrent.Callable;
+import com.jd.blockchain.ledger.ContractExecuteException;
import com.jd.blockchain.utils.concurrent.AsyncFuture;
import com.jd.blockchain.utils.concurrent.CompletableAsyncFuture;
@@ -93,7 +94,7 @@ public abstract class AbstractModule implements Module {
try {
return callable.call();
} catch (Exception e) {
- throw new IllegalStateException(e.getMessage(), e);
+ throw new ContractExecuteException(e.getMessage(), e);
} finally {
if (origClassLoader != Thread.currentThread().getContextClassLoader()) {
Thread.currentThread().setContextClassLoader(origClassLoader);