Skip to content

Commit

Permalink
Update 异常处理.md
Browse files Browse the repository at this point in the history
  • Loading branch information
tjchern authored Aug 31, 2018
1 parent 4544877 commit c2f0235
Showing 1 changed file with 17 additions and 7 deletions.
24 changes: 17 additions & 7 deletions 中文文档/虚拟机/异常处理.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 执行合约时,会出现三种类型的异常:
1. Assert-style异常
2. Require-style异常
3. Timeout-style异常
3. validation-style异常

# Assert-style异常
下列情况将会产生一个assert-style异常,会抛出invalid opcode错误,消耗所有的Energy(包括当前为止已经消耗的Energy和未消耗的Energy)
Expand All @@ -12,7 +12,10 @@
5. 如果你将一个太大或负数值转换为一个枚举类型
6. 如果你调用未被初始化的内部函数类型变量
7. 如果你调用assert的参数(表达式)最终结果是false
8. 调用一个系统合约发生Exception
8. 调用一个内置系统合约发生Exception
9. 合约执行过程中超时
10. 发生JVMStackOverFlowException
11. 发生OutOfMem异常,即内存超过了3M

# Require-style异常
下列情况将会产生一个require-style异常,会抛出revert错误,仅仅消耗当前为止已经消耗的energy,不包括未消耗的Energy
Expand All @@ -24,10 +27,9 @@
6. transfer() 失败
7. 调用revert()

# Timeout-style异常
下列情况将会产生一个timeout-style异常,该类异常会导致交易不上链,也不会消耗任何Energy,即使是当前为止已经消耗的energy也不会消耗
1. 合约运行过程中超时
2. 合约验证不通过
# validation-style异常
下列情况将会产生一个validation-style异常,该类异常下交易不上链,也不会消耗任何Energy
1. 合约验证不通过

注:assert-style和require-style这两种情况下,都会导致TVM 回退。回退的原因是不能继续安全地执行,因为没有实现预期的效果。 因为我们想保留交易的原子性,所以最安全的做法是回退所有更改。但是会进行扣费。

Expand Down Expand Up @@ -67,6 +69,11 @@ public void go() {
deposit.commit();
}
}
catch (JVMStackOverFlowException e) {
// TVM或者JVM,发生stackoverflow,标记异常
result.setException(e);
runtimeError = result.getException().getMessage();
}
// catch住所有能抛出的内容
catch (Throwable e) {
// 如果异常未知,则标记
Expand Down Expand Up @@ -102,7 +109,10 @@ public void go() {
} else {
program.setRuntimeFailure(e);
}
} catch (StackOverflowError soe) {
} catch (JVMStackOverFlowException e) {
throw new JVMStackOverFlowException();
}
catch (StackOverflowError soe) {
// 如果是StackOverflowError异常,则退出程序
System.exit(-1);
} finally {
Expand Down

0 comments on commit c2f0235

Please sign in to comment.