关键点提炼:
- 大部分反馈信息的字符串都不支持中文,会编译报错,比如require的第二个参数字符串
- public和external不能同时使用,public和external允许外部调用,使用两个说明符声明一个函数是多余的,并会导致编译错误
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
contract testError{
//学习三个错误控制
//require revert assert
//利用错误反馈来学习判断输入数据的大小
//require(condition, "My error string");
//其中 condition 是布尔表达式,如果其结果是 false 那么就会抛出异常。然后所有状态变量都会恢复原状
string errorMsg \= "num is > 10";
function testRequire(uint Num) public view returns ( string memory) {
// 这里有一个错误点,字符串不能是中文
require(Num <= 10 , errorMsg);
if (Num \== 15){
return "s";
}else {
revert("sss");
}
//assert 与require 一样,是布尔表达式,但是不返回错误信息,只有一个参数
//共同点是使用错误返回,可以实现回滚和不消耗gas
//提问,10 和 15会分别输出什么?O_o (永远不会执行 返回 s 哦)
}
}
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
contract controller{
// 学习使用控制器
//函数修改器
//需求,合约执行时,先对参数进行判断再执行
/**
其中要注意 _ 是一个占位符(placeholder),代表的是函数主体(function body)。你可以认为函数主体被移动到 _ 所在的位置。
*/
//定义一个布尔值来当做开关
bool public isOFF;
//定义一个初始数字
uint public chushi;
//定义一个开关函数 只能被合约调用关键词 external
function setStart(bool zhi) external {
// 如果 _zhi为true,那么isOFF = true;否则isOFF = false。
isOFF \= zhi;
}
//定义自增自减函数
function inc() public kongzhiqi() {
chushi \= chushi + 1;
}
function dec() external kongzhiqi(){
chushi \= chushi - 1;
}
//定义控制器也就是我说的开关,这是一个新的关键词modified
modifier kongzhiqi(){
//!isOFF 表示对 isOFF 变量进行逻辑非操作。如果 isOFF 为真,则 !isOFF 为假;如果 isOFF 为假,则 !isOFF 为真
//! 运算符用于逻辑非,它会将布尔值取反
require(!isOFF,"ss");
_;//这个下划线就代表谁调用这个函数,谁就在这里执行
}
//在solidity中不会永远无限自增下去,所以,我们要给一个限制的控制器,继续编写代码
//定义一个控制器
modifier kongzhiqi2(uint x){
//我们让它10次就停止,返回错误信息ss
require(x<=10,"sss");
_;
//当然这里还可以继续写逻辑
}
//定义外部输入值的一个自增方法 注意,这里补习知识,public和external不能同时使用,
//ublic和external允许外部调用,使用两个说明符声明一个函数是多余的,并会导致编译错误
function inc2(uint x) external kongzhiqi2(x) kongzhiqi(){
chushi += x;
}
}
