Skip to content

错误处理

错误将回滚事务期间进行的所有状态更改。与Solidity类似,可以通过使用revert、assert、require来抛出错误。

  • revert 函数调用直接回滚事务
  • assert 只有在条件不满足时才会回滚
  • require 只有在条件不满足时才会引发错误

注意:在谓词中,revert关键字将会引发 panic。

sway
contract;

dep errors;
dep interface;

use errors::*;
use interface::*;

use std::{
    revert::require,
    assert::assert,
    logging::log
};

impl Error for Contract {
    fn test_revert(special_number: u64) {
        if (special_number != 42) {
            revert(0)
        }
    }

    fn test_require(special_number: u64) {
        require(special_number == 42, "Special number must be equal to 42");
    }

    fn test_assert(special_number: u64) {
        assert(special_number == 42);
    }

    fn test_custom_require(special_number: u64) {
        require(special_number == 42, InputError::InputSmallerThan42);
    }

    fn test_option(special_number: Option<u64>) {
        require(special_number.is_some(), InputError::NumberDoesNotExist);
        // require(special_number.is_none(), InputError::NumberExist);
    }

    fn test_result(special_number: u64) -> Result<u64, InputError> {
        match special_number == 42 {
            true => Result::Ok(special_number),
            false => Result::Err(InputError::InputIsNot42),
        }
    }
}

这是导入自定义错误的项目结构。

└── Import
    └── src
        ├── main.sw
        └── errors.sw

注意:与Solidity类似,使用自定义错误将有助于减少字节码大小并提供燃气节省。

sway
library errors;

pub enum InputError {
    InputSmallerThan42: (),
    InputIsNot42: (),
    NumberDoesNotExist: (),
    NumberExist: (),
}