---
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費用的不同。
:::