Skip to content

Latest commit

 

History

History
65 lines (55 loc) · 2.11 KB

File metadata and controls

65 lines (55 loc) · 2.11 KB

异常

Solidity中有3种抛出异常的方式,分别是error,require,assert

error

// 首先申明一个error异常
error TransferNotOwner(); // 自定义error

error TransferNotOwner(address sender);//自定义带参数的error

// 搭配revert(回退)使用
function transferOwner1(uint256 tokenId, address newOwner) public {
    if(_owners[tokenId] != msg.sender){
        revert TransferNotOwner();
        // revert TransferNotOwner(msg.sender);
    }
    _owners[tokenId] = newOwner;
}

require

require命令是solidity 0.8版本之前抛出异常的常用方法,目前很多主流合约仍然还在使用它。它很好用,唯一的缺点就是gas随着描述异常的字符串长度增加,比error命令要高。使用方法:require(检查条件,"异常的描述"),当检查条件不成立的时候,就会抛出异常。

function transferOwner2(uint256 tokenId, address newOwner) public {
    require(_owners[tokenId] == msg.sender, "Transfer Not Owner");
    _owners[tokenId] = newOwner;
}

assert

assert命令一般用于程序员写程序debug,因为它不能解释抛出异常的原因(比require少个字符串)。它的用法很简单,assert(检查条件),当检查条件不成立的时候,就会抛出异常。

function transferOwner3(uint256 tokenId, address newOwner) public {
    assert(_owners[tokenId] == msg.sender);
    _owners[tokenId] = newOwner;
}

函数重载

在一个合约中函数名字相同参数类型不同的,叫作重载,修饰器不允许重载

函数重载

例子

function saySomething() public pure returns(string memory){
    return("Nothing");
}

function saySomething(string memory something) public pure returns(string memory){
    return(something);
}

实参匹配

我们定义了两个函数一个参数为uint8,另一个为uint256:

function f(uint8 _in) public pure returns (uint8 out) {
    out = _in;
}

function f(uint256 _in) public pure returns (uint256 out) {
    out = _in;
}

我们调用f(50),因为50既可以被转换为uint8,也可以被转换为uint256,因此会报错。