--- title: 'Solidity WTF 101 15 單元' lang: zh-tw --- Solidity WTF 101 15 單元 === :::info :date: 2024/09/30 ::: [TOC] # 課程學習 ## 異常 有三種拋出異常的方法 - error - require - assert ### Error 必須搭配 `revert`命令使用。 這邊引入課程中的方法 - 定义了一个`transferOwner1()`函数,它会检查代币的`owner`是不是发起人,如果不是,就会抛出`TransferNotOwner`异常;如果是的话,就会转账。 ```xml= error TransferNotOwner(); // 自定义error <!-- error TransferNotOwner(address sender); // 自定义的带参数的error --> function transferOwner1(uint256 tokenId, address newOwner) public { if(_owners[tokenId] != msg.sender){ revert TransferNotOwner(); // revert TransferNotOwner(msg.sender); } _owners[tokenId] = newOwner; } ``` ### Require 參數可帶也可不帶,帶參數`gas`會比較高,本身`gas`比`error`高 ```xml= function transferOwner2(uint256 tokenId, address newOwner) public { require(_owners[tokenId] == msg.sender, "Transfer Not Owner"); _owners[tokenId] = newOwner; } ``` ### Assert 一般用於`debug`,因為不會拋出異常,只需要帶入參數,若不成立就會拋出錯誤。 ```xml= function transferOwner3(uint256 tokenId, address newOwner) public { assert(_owners[tokenId] == msg.sender); _owners[tokenId] = newOwner; } ``` ### 重點整理 - 分為三個拋出錯誤方法`error`、`requier`、`assert`。 - `gas`由高到低為`require` -> `assert` -> `error`。 - `error`需搭配`revert`使用 :::success 這一章重點我認為是gas費用的不同。 :::