Solidity 练习:错误处理
睡不醒的鲤鱼 2022-12-29 Web3 Solidity
# 一、题目说明
Solidity 有 3 种方法来抛出错误:require,revert 和 assert。
- require 用于在执行之前和之后验证输入并检查条件。
- revert 就像 require 一样,但是当要检查的条件嵌套在几个 if 语句中时更方便。
- assert 用于检查不变量,代码永远不应该是 false。断言失败可能意味着存在错误。
出现错误将回退交易过程中产生的所有更改。
# 二、任务列表
- 函数 div 输入 x 和 y,返回商。
- 除以 0 是无效的。
- 通过检查 y 是否大于 0 来完成函数 div。
- 如果 y 为 0,则抛出错误消息 “div by 0”。
# 三、解答代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract ErrorHandling {
function testRequire(uint _i) external pure {
// Require should be used to validate conditions such as:
// - inputs
// - conditions before execution
// - return values from calls to other functions
require(_i <= 10, "i > 10");
}
function testRevert(uint _i) external pure {
// Revert is useful when the condition to check is complex.
// This code does the exact same thing as the example above
if (_i > 10) {
revert("i > 10");
}
}
uint num;
function testAssert() external view {
// Assert should only be used to test for internal errors,
// and to check invariants.
// Here we assert that num is always equal to 0
// since it is impossible to update the value of num
assert(num == 0);
}
function div(uint x, uint y) external pure returns (uint) {
require(y > 0, "div by 0");
return x / y;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36