Solidity是通过回退状态的方式来处理异常错误(有点像事务回滚)。发生异常时会撤消当前调用(及其所有子调用)所改变的状态,同时给调用者返回一个错误标识。注意捕捉异常是不可能的,因此没有try catch。
1.条件检查
Solidity提供了assert和require来进行
* require: require函数来检查输入变量或合约状态变量是否满足条件以及验证调用外部合约返回值。可以有返回值require(condition, 'Something bad happened');
* assert: assert函数通常用来检查(测试)内部错误
注:同样作为判断一个条件是否满足的函数,require会退回剩下的gas,而assert会消耗所有的gas。
2.触发异常
提供了revert,throw来触发异常:
* throw:关键字抛出异常(从0.4.13版本,throw关键字已被弃用,将来会被淘汰。)回滚所有状态改变,返回”无效操作代码错误”,而且消耗掉剩下的gas
* revert:函数可以用来标记错误并回退当前调用,允许返回一个数值,将剩余gas返还调用者
传统处理异常的方式if...throw模式
即 if(msg.sender != owner) { throw; }
等价于:
* if(msg.sender != owner) { revert(); }//如果不等则异常
* assert(msg.sender == owner);//校验是否等于
* require(msg.sender == owner);

本文介绍了Solidity中的异常处理机制,包括条件检查、触发异常的方法。require函数用于输入验证和条件检查,会退回剩余gas;assert用于内部错误检查,消耗所有gas;revert则用于更复杂的异常场景,允许返回部分gas。建议require用于常规验证,revert用于复杂逻辑的异常,assert则用于预防不应该发生的错误,主要在测试阶段使用。
最低0.47元/天 解锁文章
632

被折叠的 条评论
为什么被折叠?



